二叉樹路徑和

2021-10-11 15:51:06 字數 3241 閱讀 8371

二叉樹中和為某一值的路徑

輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。

示例:

給定如下二叉樹,以及目標和sum = 22

5

/ \4 8

/ / \

11 13 4

/ \ / \

7 2 5 1

返回:

[[5,4,11,2],

[5,8,4,5]

]

public list> pathsum(treenode root, int sum) 

public void trace(treenode root, int sum, int partsum, list> lists, stackstack)

partsum += root.val;

stack.push(root.val);

if (root.left == null && root.right == null)

}trace(root.left, sum, partsum, lists, stack);

trace(root.right, sum, partsum, lists, stack);

partsum -= root.val;

stack.pop();

}

路徑總和 iii

給定乙個二叉樹,它的每個結點都存放著乙個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

10/ \

5 -3

/ \ \

3 2 11

/ \ \

3 -2 1

返回 3。和等於 8 的路徑有:

1. 5 -> 3

2. 5 -> 2 -> 1

3. -3 -> 11

方法一:兩個dfs

先序遍歷每乙個結點,以每乙個結點作為根尋找滿足和的路徑

private int count;

public int pathsum(treenode root, int sum)

public void preorder(treenode root, int sum)

trace(root, sum, 0);

preorder(root.left, sum);

preorder(root.right, sum);

}private void trace(treenode root, int sum, int partsum)

partsum += root.val;

if (partsum == sum)

trace(root.left, sum, partsum);

trace(root.right, sum, partsum);

}

方法二:字首和

如果字首總和currsum,在節點a和節點b處相差target,則位於節點a和節點b之間的元素之和是target

private mapmap = new hashmap<>();//key:字首和 value:次數

public int pathsum(treenode root, int sum)

private int trace(treenode root, int sum, int partsum)

partsum += root.val;

int ans = 0;

ans += map.getordefault(partsum - sum, 0);

map.put(partsum, map.getordefault(partsum, 0) + 1);

ans += trace(root.left, sum, partsum);

ans += trace(root.right, sum, partsum);

//回到本層,恢復狀態,不再是字首了

map.put(partsum, map.get(partsum) - 1);

return ans;

}

二叉樹中的最大路徑和

給定乙個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。

示例 1:

輸入: [1,2,3]

1/ \

2 3

輸出: 6

示例 2:

輸入: [-10,9,20,null,null,15,7]

-10/ \

9 20

/ \

15 7

輸出: 42

每走到乙個結點,有三個選擇:

private int max = integer.min_value;

public int maxpathsum(treenode root)

dfs(root);

return max;

}public int dfs (treenode root)

int left = math.max(0, dfs(root.left));//為負數就不向下走了

int right = math.max(0, dfs(root.right));

max = math.max(max, left + right + root.val);

return root.val + math.max(left, right);//以root為根直路的長度

}

二叉樹 路徑

二叉樹中,從根節點到葉節點的每一條連線,我們稱之為路徑,最短路徑和最長路徑在之前的部落格中,我們已經完成了對他們的討論,現在我們討論一下,輸出一棵二叉樹中全部的路徑資訊。如下所示 public class operation childbinarytreepath root,return resul...

二叉樹路徑和問題

今天回顧了一下二叉樹給定sum的問題,邏輯還是有問題,本以為對的,寫了如下的 bool haspathsum treenode root,int sum if path sum return true p s.top s.pop if p left null path p left val p p ...

二叉樹的路徑和

給定乙個二叉樹,找出所有路徑中各節點相加總和等於給定 目標值 的路徑。乙個有效的路徑,指的是從根節點到葉節點的路徑。給定乙個二叉樹,和 目標值 5 1 2 4 2 3 返回 1,2,2 1,4 這個題目是二叉樹的遍歷問題,由於是從根節點出發的路徑,所以用先序遍歷。並且維護從當前節點到根節點的所有累加...