1. 程式人生 > >牛客網 二叉樹中和為某一值的路徑

牛客網 二叉樹中和為某一值的路徑

題目描述:

輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根節點開始往下一直到葉節點所經過的結點形成一條路徑。

思路:

1、由於路徑是從根節點出發到葉節點,也就是說路徑總是以根節點為起點,因此我們首先需要遍歷根節點,在樹的前序、中序和後序三種遍歷方式中,只有前序遍歷是首先訪問根節點的。

2、當用前序遍歷的方式訪問某一結點時,我們把該節點新增到路徑上,並累加該節點的值。如果該結點為葉節點並且路徑上結點的值的和正好等於輸入的整數,則當前的路徑符合要求,我們把它打印出來。如果當前節點不是葉節點,則繼續訪問它的子節點。當前訪問結束後,遞迴函式將自動回到它的父節點。因此我們在函式退出之前要在路徑上刪除當前節點並減去當前節點的值,以確保返回父節點時路徑剛好是從根節點到父節點的路徑。我們不難看出儲存路徑的資料結構實際上是一個棧,因為路徑要與遞迴呼叫狀態一致,而遞迴呼叫的本質就是一個壓棧和出棧的過程。

程式碼:

import java.util.ArrayList;
import java.util.Stack;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        ArrayList<ArrayList<Integer>> listPath=new ArrayList<ArrayList<Integer>>();
        Stack<Integer> stack=new Stack<Integer>();
        if(root==null){//樹為空樹
            return listPath;
        }
        FindPath(root,target,stack,listPath);
        return listPath;
    }
    public void FindPath(TreeNode root,int target,Stack<Integer> stack,ArrayList<ArrayList<Integer>> listPath){
        if(root==null){
            return;
        }
        if(root.left==null&&root.right==null){//是葉子節點
            if(root.val==target){
                ArrayList<Integer> list=new ArrayList<Integer>();
                for(int i:stack){
                    list.add(new Integer(i));
                }
                list.add(new Integer(root.val));
                listPath.add(list);
            }
        }
        else{//非葉子節點
            stack.push(new Integer(root.val));
            FindPath(root.left,target-root.val,stack,listPath);
            FindPath(root.right,target-root.val,stack,listPath);
            stack.pop();
        }
    }
}

不使用棧,程式碼:

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    ArrayList<Integer> listNode=new ArrayList<Integer>();//存放節點
    ArrayList<ArrayList<Integer>> listPath=new ArrayList<ArrayList<Integer>>();//存放路徑
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        if(root==null){//樹為空樹
            return listPath;
        }
        listNode.add(root.val);
        target-=root.val;
        if(target==0&&root.left==null&&root.right==null){
            listPath.add(new ArrayList<Integer>(listNode));
        }
        FindPath(root.left,target);
        FindPath(root.right,target);
        listNode.remove(listNode.size()-1);//把連結串列中最後新增進去的節點刪除掉
        return listPath;
    }

}

程式碼的主要思想是樹的先序遍歷

listNode.remove(listNode.size()-1):這是模擬了棧退回,當前節點為葉子節點或者已經訪問過的情況下,回溯到父節點。

listPath.add(new ArrayList<Integer>(listNode)):必須要重新生成一個物件例項,並使用listNode對其進行初始化賦值,不能直接listPath.add(listNode),因為listNode本質上是引用,在各次遍歷中會直接改變它的值,最後的路徑集合中前面的路徑也會被後面的覆蓋。

相關推薦

中和路徑

題目描述:輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根節點開始往下一直到葉節點所經過的結點形成一條路徑。思路:1、由於路徑是從根節點出發到葉節點,也就是說路徑總是以根節點為起點,因此我們首先需要遍歷根節點,在樹的前序、中序和後序三

中和路徑

題目: 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 解答: # class TreeNode: #

刷題|中和路徑

題目來源:牛客網 程式設計連線 題目描述 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 解析: 經典DFS演算法,深度優先演算法 cl

劍指offer——中和路徑

題目描述輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。思路    首先想到的自然是遞迴。遞迴思路為,若當前節點為空,則返回;若當前節點為葉子節點,且val與期望數值相等,則將該路徑加

刷題——中和路徑

題目描述: 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 解答:    private ArrayList&l

劍指offer-中和路徑

題目描述輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。/* struct TreeNode { int v

中和的所有路徑

說明 util ray 如果 tree 二叉樹 節點 integer fin 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 import java.util.ArrayList

24、劍指offer--中和路徑

val 遍歷 描述 所有 oid res bold eno bsp 題目描述 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 解題思路:本題采用先序遍歷,遍歷到葉子節點,如果和

中和路徑

one 結點 col val exp fff return back 節點 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 思路:深搜(DFS) struct TreeN

劍指offer十四之中和路徑

rgs one main java http ring dal offer for 一、題目   輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 二、思路 詳見代碼 三、

劍指Offer——中和路徑

roo int paths struct () node nod cnblogs ret 題目描述: 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 分析: 先序遍歷二叉樹,找到

劍指offer-25.中和路徑

path val tmp aux node ptr body 深度 light 0 題目 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 1 分析 深度優先遍歷+回溯. 出點就是,

python劍指offer系列中和路徑

not 和為某一值的路徑 python 數組長度 self. expect pytho def lis 題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(註意:

劍指offer---中和路徑

題目:二叉樹中和為某一值的路徑 要求:輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 1 /* 2 struct TreeNode { 3 int val; 4 struct

中和路徑 python

  輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。   分析:我們可以先從最簡單的情況開始考慮,最簡單的情況就是二叉樹只有一個根節點,判斷根節點的值與期望值是否相同就ok了。二叉樹稍微複雜一點就是根節點還有

劍指offer系列(十) 中和路徑,複雜連結串列的複製,

二叉樹中和為某一值的路徑 題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 解題思路: 深度優先遞迴遍歷樹, 把結點加入

[劍指offer] --25.中和路徑

題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。 路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 解題思路 每次先把開始的頭結點儲存,然後使用輸入的路

六:中和路徑

/** * 題目:二叉樹中和為某一值的路徑 * 描述:   輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。 *   路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑 * 方案: 

《劍指offer》系列 中和路徑(Java)

連結 牛客: 二叉樹中和為某一值的路徑 題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 思路 題目給定

【劍指offer】中和路徑【python】

題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 思路: 暴力遍歷二叉樹每一個節點,採用遞歸回溯的思想。建立一個全域性的re