[演算法學習]列印樹的路徑
阿新 • • 發佈:2019-01-09
問題描述: 輸入一個整數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();
}
- 附:原始碼地址