劍指offer--面試題25:二叉樹中和為某一值的路徑--Java實現
阿新 • • 發佈:2019-02-02
題目描述:
輸入一課二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
解題思路:
先模擬一下過程:樹的結構如下所示,期待路徑的和為22
10→5→4是一條路徑,它們的和不是22。所以下一條路徑10→5→7,(這是一種回溯的方法),它們的和22,然後回溯,下一條路徑10→12。這裡我們只有到葉子結點才有必要判斷和是否等於期待的數值。
首先需要選擇一種遍歷方式,一定是深度優先,進一步要先訪問根結點,所以選擇先序遍歷。
然後是選擇一種資料結構儲存路徑,因為回溯的話肯定是要知道之前的結點的。一般採用棧結構,但是這裡注意一點就是題目中要求列印路徑,而列印棧中的元素是要出棧的,所以我們可以用普通的連結串列模仿棧的行為。
程式碼如下:
import java.util.LinkedList;
import java.util.List;
public class FindPathTest {
static class Node{
int key;
Node left;
Node right;
Node(int key){
this.key = key;
}
}
public static void findPath(Node root, int expect){
if (root == null){
return;
}
List<Node> path = new LinkedList<Node>();
int currentSum = 0;
findPath(root, expect, path, currentSum);
}
private static void findPath(Node node, int expect, List<Node> path,
int currentSum) {
currentSum += node.key;
path.add(node);
if (node.left == null && node.right == null && currentSum == expect){
System.out.println("A path is found : ");
for(Node n : path){
System.out.print(n.key + " ");
}
System.out.println("");
}
if(node.left != null){
findPath(node.left, expect, path, currentSum);
}
if(node.right != null){
findPath(node.right, expect, path, currentSum);
}
path.remove(path.size() - 1);
}
public static void main(String[] args) {
Node root = new Node(8);
Node node8 = new Node(8);
Node node7 = new Node(7);
root.left = node8;
root.right = node7;
Node node9 = new Node(9);
node8.left = node9;
Node node2 = new Node(2);
node8.right = node2;
Node node4 = new Node(4);
Node node72 = new Node(7);
node2.left = node4;
node2.right = node72;
findPath(root, 15);
}
}