描述
输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
如二叉树root为{10,5,12,4,7},expectNumber为22
则合法路径有[[10,5,7],[10,12]]
示例
输入:
{10,5,12,4,7},22
返回值:
[[10,5,7],[10,12]]
思路👇👇
我们从根节点开始向左右子树进行递归,递归函数中需要处理的是:
1.当前的路径path要更新
2.当前目标值expectNuber要迭代,减去当前节点的值
3.若当前节点是叶子节点,考虑是否满足路径的期待值,并考虑是否将路径添加到返回列表中
具体做法:
1:维护两个向量ret和path
2: 编写递归函数dfa
3:递归函数内部要处理更新path,更新experNumber,判读是否为叶子节点和判断是否要将path追加到ret末尾
代码如下:👇👇
import java.util.ArrayList;
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private ArrayList<ArrayList<Integer>>ret=new ArrayList<>();
private LinkedList<Integer> path=new LinkedList<>();
void dfs(TreeNode root,int number){
//处理树为空
if(root==null) return;
//路径更新
path.add(root.val);
//更新number
number-=root.val;
//如果递归当前节点为叶子节点且该条路径的值已经到达了expectNumber ,则更新路径
if(root.left==null&&root.right==null&&number==0){
ret.add(new ArrayList<>(path));
}
//左右子树递归
dfs(root.left,number);
dfs(root.right,number);
path.removeLast();
}
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int expectNumber) {
dfs(root,expectNumber);
return ret;
}
}