1. 程式人生 > >[演算法學習]列印樹的路徑

[演算法學習]列印樹的路徑

問題描述: 輸入一個整數sum和一棵二叉樹,打印出二叉樹中結點和為sum的所有路徑。 (路徑:從根結點往下一直到葉結點形成的一條路徑。)

解法與分析:
1. 需要從樹上的根結點遍歷到葉子結點,其中需要累加經過結點的值。
2. 當累加到葉子結點時,比較累加結點值和sum的值,如果相等,打印出路徑;如果不相等,返回到上一層,尋找其他葉子結點。
3. 需要儲存結點路徑,還可以返回到上一個結點,可以選擇用棧來儲存經過結點。
4. 可以使用遞迴來描述這個解法。

參考程式碼如下

/**
 * 樹結點
 */
static class TreeNode
{
    int
val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } public TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } } /** * 尋找路徑 */ public static void findPath
(TreeNode root, int sum) { if (root == null) return; Stack<Integer> paths = new Stack<Integer>(); findPath(root, paths, sum, 0); } /** * 遞迴尋找路徑 */ private static void findPath(TreeNode root, Stack<Integer> paths, int sum,int currentSum) { currentSum += root.val; boolean
isLeaf = root.left == null && root.right == null; paths.push(root.val); if (isLeaf && currentSum == sum) { printPath(paths); } if (root.left != null) { findPath(root.left, paths, sum, currentSum); } if (root.right != null) { findPath(root.right, paths, sum, currentSum); } paths.pop(); } /** * 列印路徑 */ static void printPath(Stack<Integer> paths) { if (paths.isEmpty()) return; for (Integer item : paths) { System.out.print(item + " - "); } System.out.println(); }