用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的空间}
}
最重要的一句话:做二叉树的题目,首先需要确认的是遍历顺序