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

劍指offer--面試題25:二叉樹中和為某一值的路徑--Java實現

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

解題思路:
先模擬一下過程:樹的結構如下所示,期待路徑的和為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); } }