二叉樹中和為某一值的路徑
輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。
示例:
給定如下二叉樹,以及目標和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 這個題目是二叉樹的遍歷問題,由於是從根節點出發的路徑,所以用先序遍歷。並且維護從當前節點到根節點的所有累加...