1. 程式人生 > >劍指offer面試題25 二叉樹中和為某一值的路徑

劍指offer面試題25 二叉樹中和為某一值的路徑

解題思路:

首先需要理解路徑的概念:路徑總是從根節點到葉節點,由於路徑是從根節點開始,所以可以考慮用先序遍歷的方式。每遍歷完一個節點進入節點的左子樹時,需要將當前節點儲存起來,作為路徑中的一個節點,之所以需要儲存路徑上的節點,是因為需要計算路徑的和,是否和待查詢元素相同。因此考慮用棧來儲存路徑。注意:當從子節點返回父節點時,需要將當前元素出棧。用於更新路徑。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Stack;

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>> pathList = new ArrayList<>();
		if (root == null) {
			
			return pathList;
			
		}
		//建立一個棧,用於儲存從根節點到葉節點的路徑
		Stack<Integer> stack = new Stack<>();
		FindPath(root, target,stack,pathList);
		return pathList;
	}

	private void FindPath(TreeNode root, int target, Stack<Integer> stack, ArrayList<ArrayList<Integer>> pathList) {
		
		if (root == null) {
			return;
		}
		
		//如果當前節點是葉子節點
		if (root.left == null && root.right == null) {
			
			if (root.val == target) {
				//如果當前節點的值和目標值相等
				ArrayList<Integer> path = new ArrayList<>();
				//1.遍歷棧,將此時棧中的元素全部加入到當前這條路徑列表中
				Iterator<Integer> iterator = stack.iterator();
				while (iterator.hasNext()) {
					path.add(iterator.next()); 
				}
				//2.將當前節點加入列表中
				path.add(root.val);
				//3.將符合條件的路徑加入路徑列表中
				pathList.add(path);
			}
			
		} else {
			stack.push(root.val);
			//對左子樹查詢值為某一個數的路徑
			FindPath(root.left, target - root.val, stack, pathList);
			//對右子樹查詢值為某一個數的路徑
			FindPath(root.right, target - root.val, stack, pathList);
			//當前節點不是葉子節點,在返回上一層父節點時,要將當前子節點出棧
			stack.pop();
		}
		
	}

}


相關推薦

offer試題25 中和路徑

解題思路:首先需要理解路徑的概念:路徑總是從根節點到葉節點,由於路徑是從根節點開始,所以可以考慮用先序遍歷的方式。每遍歷完一個節點進入節點的左子樹時,需要將當前節點儲存起來,作為路徑中的一個節點,之所以需要儲存路徑上的節點,是因為需要計算路徑的和,是否和待查詢元素相同。因此

offer 試題25中和路徑

題目: 輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。 基本思想: 規律: 遍歷到某一節點時,將節點新增到路徑中,並累加該節點的值。如果該節點為葉節點並且路徑中節點值的和等於輸入整

offer--試題25:中和路徑--Java實現

題目描述: 輸入一課二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 解題思路: 先模擬一下過程:樹的結構如下所示,期待路徑的和為22 10→5→4是一條路徑,它們的和不是22

offer試題25-中和路徑

question:給定一顆二叉樹,一個值。我們希望輸出和為該值的所有路徑。 假設樹的結構如下 思路:使用一個基於先序遍歷的遞迴過程來遍歷樹中每個點一次,每遍歷一個點就要獲得從根節點到被訪問的點的累加和,並儲存從根節點到當前點的路徑。然後進行判斷, case1如果當前點的左

Offer】 24、中和路徑

new tro urn 前序遍歷 addall sort pub remove http ??題目描述: ??輸入一顆二叉樹的根結點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(註意: 在返回

offer-25.中和路徑

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

[offer] --25.中和路徑

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

offer-Java版】25中和路徑

二叉樹中值和為某一值的路徑:類似圖的深度優先遍歷 對於此類問題一直有點弱,多想幾次就OK了–主要是不熟悉,畢竟程式碼寫出來之後一看就明白,但是自己想的時候還是有點困難 publi

試題中和路徑

color target size 必須 amp code ger 試題 註意 題目描述:輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(註意: 在返回值的list中,數組

offer{試題25中和路徑}

思路:這道題比較有意思,類似的題我在面試裡經常遇到過,圍繞著樹的深度遍歷和廣度遍歷做文章,針對這種型別的題,大家更多考慮的解決方案是遞迴,說白了二叉樹就是一群小二叉樹,上次做寶寶樹的筆試題的時候,出的演算法題就是求任意兩個節點之間的最遠距離,說白了還是遍歷的問題,回到這道題  &n

Offer試題25(Java版):中和路徑

題目:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉結點所經過的所有的結點形成一條路徑。 如下圖,輸入二叉樹和整數22,則打印出兩條路徑,第一條路徑包含結點10,12,第二條路徑包含的結點為10,5,7. 一般的資料結構

Offer系列-試題25中和路徑

題目:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 思路: 程式碼: vector<vector&

offer——試題25中和路徑

void FindPath(BinaryTreeNode* pRoot, int expectedSum) { if(pRoot == NULL) return;

offer試題25中和路徑

題目:輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。思路:用棧記錄路徑,sum記錄當前和。如果是葉結點,判斷sum是否等於target,如果等於則輸出。help的方法最後需要將棧頂彈出,sum

Offer 試題34:中和路徑 Java程式碼實現

題目:輸入一棵二叉樹和整數,打印出二叉樹中節點值得和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。 解題思路:路徑從根節點開始,應該用類似於前序遍歷的方式訪問樹節點。

offer試題34:中和路徑

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

Offer試題:23.中和路徑

一、題目:二叉樹中和為某一值的路徑 題目:輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。例如輸入下圖中二叉樹和整數22,則打印出兩條路徑,第一條路徑包含結點10、12,第二條路徑包含結點10、5和7。   二叉

Offer 25中和路徑 Java

對二叉樹的相關演算法還是不瞭解。 這裡有兩點是之前所用不好的: 1:把棧用進來; 2:有一個變數記錄當前的數值,這個在遞迴的過程當中就能夠得到之前的值。 package test; import java.util.Stack; public class FindPat

offer——(25中和路徑

參考題解: 牛客網 深度優先搜尋(DFS):此題解中,程式執行找到[10, 5, 4]後,4為葉子節點了,remove掉4,變為[10, 5],這時執行if(root.right != null) FindPath(root.right,target); 找到[10, 5,

24、offer--中和路徑

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