問題描述
其中路徑指的是從跟節點到葉子節點經過的路徑
代碼
package com.yuzhiyun;
import java.util.ArrayList;
import java.util.List;
public class FindPathInBinaryTree {
/**
* 二叉樹的樹結點
*/
public static class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}
/**
* 輸入一棵二叉樹和一個整數, 打印出二叉樹中結點值的和爲輸入整數的所有路徑。 從樹的根結點開始往下一直到葉銷點所經過的結點形成一條路徑。
*
* @param root
* 樹的根結點
* @param expectedSum
* 要求的路徑和
*/
public static void findPath(BinaryTreeNode root, int expectedSum) {
// 創建一個鏈表,用於存放根結點到當前處理結點的所經過的結點
List<Integer> list = new ArrayList<>();
// 如果根結點不爲空,就調用輔助處理方法
if (root != null) {
findPath(root, 0, expectedSum, list);
}
}
/**
* @param root
* 當前要處理的結點
* @param curSum
* 當前記錄的和(還未加上當前結點的值)
* @param expectedSum
* 要求的路徑和
* @param result
* 根結點到當前處理結點的所經過的結點,(還未包括當前結點)
*/
public static void findPath(BinaryTreeNode root, int curSum, int expectedSum, List<Integer> result) {
// 如果結點不爲空就進行處理
if (root != null) {
// 加上當前結點的值
curSum += root.value;
// 將當前結點入隊
result.add(root.value);
// 如果當前結點的值小於期望的和
if (curSum < expectedSum) {
// 遞歸處理左子樹
findPath(root.left, curSum, expectedSum, result);
// 遞歸處理右子樹
findPath(root.right, curSum, expectedSum, result);
}
// 如果當前和與期望的和相等
else if (curSum == expectedSum) {
// 當前結點是葉結點,則輸出結果
if (root.left == null && root.right == null) {
System.out.println(result);
}
}
// 移除當前結點,向上回溯
result.remove(result.size() - 1);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// 10
// / \
// 5 12
// /\
// 4 7
BinaryTreeNode root = new BinaryTreeNode();
root.value = 10;
root.left = new BinaryTreeNode();
root.left.value = 5;
root.left.left = new BinaryTreeNode();
root.left.left.value = 4;
root.left.right = new BinaryTreeNode();
root.left.right.value = 7;
root.right = new BinaryTreeNode();
root.right.value = 12;
// 有兩條路徑上的結點和爲22
System.out.println("findPath(root, 22);");
findPath(root, 22);
// 沒有路徑上的結點和爲15
System.out.println("findPath(root, 15);");
findPath(root, 15);
// 有一條路徑上的結點和爲19
System.out.println("findPath(root, 19);");
findPath(root, 19);
}
}
運行結果
findPath(root, 22);
[10, 5, 7]
[10, 12]
findPath(root, 15);
findPath(root, 19);
[10, 5, 4]