用Java實現,給定一個二叉樹root和一個值 sum ,找到從根節點到葉子節點的節點值之和等于 sum 的路徑。
1.該題路徑定義為從樹的根結點開始往下一直到葉子結點所經過的結點
2.葉子節點是指沒有子節點的節點
3.路徑只能從父節點到子節點,不能從子節點到父節點
4.總節點數目為n
做這道題之前,先回顧一下這道題
判斷二叉樹兩數之和
給定一個二叉樹root和一個值 sum ,判斷是否有從根節點到葉子節點的節點值之和等于 sum 的路徑。
很明顯題目要求:從上至下,所以直接前序遍歷
即可
public class Solution {/**** @param root TreeNode類* @param sum int整型* @return bool布爾型*/public boolean hasPathSum (TreeNode root, int sum) {// write code hereif (root == null)return false;if (root.left == null && root.right == null) {//到達葉子結點后,判斷葉子結點與sum剩余值是否相等return sum == root.val;}return hasPathSum(root.left, sum - root.val) ||hasPathSum(root.right, sum - root.val);}
}
找到滿足二叉樹兩數之和的所有路徑
import java.util.*;public class Solution {public List<List<Integer>> pathSum(TreeNode root, int sum) {List<List<Integer>> res = new ArrayList<>();if (root == null) {return res;}List<Integer> path = new ArrayList<>();dfs(root, sum, path, res);return res;}//前序遍歷二叉樹private void dfs(TreeNode root, int sum, List<Integer> path, List<List<Integer>> res) {if (root == null) {//當節點為空,直接返回return;}path.add(root.val);sum -= root.val;if (root.left == null && root.right == null && sum == 0) {//遞歸終止條件:當前節點都無孩子節點且sum減為0res.add(new ArrayList<>(path));} else {dfs(root.left, sum, path, res);dfs(root.right, sum, path, res);}path.remove(path.size() - 1);//無論最后path中的元素是否滿足,//每一次遞歸完成后都會清空list的空間}
}
最重要的一句話:做二叉樹的題目,首先需要確認的是遍歷順序