此题衍生出三个版本,下面,我将分别讲讲,
第一个版本
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
若存在,则返回true,不存在则返回false
此题可以利用递归遍历每个节点,看是否存在符合条件的路径,代码如下
public boolean hasPathSum (TreeNode<Integer> root, int sum) {
if(null == root){
return false;
}
sum = sum - root.val;
if(sum == 0 && root.left == null && root.right == null){
return true;
}
return firstHasPathSum(root.right,sum) || firstHasPathSum(root.left,sum);
}
第二个版本
输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
若有符合条件的路径,则返回路径即可,若存在多个符合条件的路径,只需要返回任意一个路径即可
此题可以利用递归遍历每个节点,看是否存在符合条件的路径,并且把路径节点利用list存储起来即可,代码如下
ArrayList<ArrayList<Integer>> listPath = new ArrayList<>();
ArrayList<Integer> path = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode<Integer> root, int target) {
if(null == root){
return listPath;
}
path.add(root.val);
target = target - root.val;
if(target == 0 && null == root.left && null == root.right){
ArrayList<Integer> resutl = new ArrayList<>(path);
listPath.add(resutl);
}
if(null != root.left){
FindPath(root.left,target);
}
if(null != root.right){
FindPath(root.right,target);
}
path.remove(path.size() - 1);
return listPath;
}
第三个版本
给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。
1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点
2.总节点数目为n
3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)
此题和第一版解法类似,只需要使用先序遍历,遍历的时候,将每个节点当做一个新的二叉树,传入第一版中的方法判断即可。
int result = 0;
public int FindPath (TreeNode root, int sum) {
if(null == root){
return result;
}
findPathResult(root,sum);
FindPath(root.left,sum);
FindPath(root.right, sum);
return result;
}
public void findPathResult(TreeNode<Integer> root, int sum){
if(root == null){
return;
}
sum = sum - root.val;
if(sum == 0){
result++;
}
findPathResult(root.left,sum);
findPathResult(root.right,sum);
}
很遗憾,又只找出了一种解法,如果大家有更好的解决方法,欢迎讨论。