【剑指offer较难部分10】二叉树中和为某一值的路径(java)
作者:互联网
题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
分析
思路(递归):
1、用深度优先搜索DFS
2、每当DFS搜索到新节点时,都要保存该节点。而且每当找出一条路径之后,都将这个保存到 list 的路径保存到二维pathList中
3、并且,每当DFS搜索到子节点,发现不是路径和时,返回上一个结点时,需要把该节点从list中移除
总结:先遍历(中序)找叶子结点,到了叶子节点就找到一条路径,判断这条路径结点值之和是否等于输入的整数target,等于则添加进入最终的pathList。代码中可以用target减去结点值,若最终减去路径上所有值等于0,就表示满足要求。
实现代码如下:
import java.util.ArrayList;
//递归
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> pathList = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
if(root == null){
return pathList;
}
findPath(root, target, new ArrayList<Integer>(), pathList);
return pathList;
}
public void findPath(TreeNode root, int target, ArrayList<Integer> cache, ArrayList<ArrayList<Integer>> pathList ) {
if (root == null) {
return;
}
int val = root.val;
int remainVal = target - val;
// 当前节点进列表,cache用于存路径(多个结点值组成路径)
cache.add(val);
// 当前节点是叶子节点,并且remainVal等于0,即路径上的值刚好等于target,该路径为一条满足条件的路径
if (remainVal == 0 && (root.left == null && root.right == null)) {
pathList.add(new ArrayList<>(cache));
}
// 处理节点
findPath(root.left, remainVal, cache, pathList);
findPath(root.right, remainVal, cache, pathList);
// 回溯到上一个节点,即根据索引删除cache中最后一个结点,返回到上一个
cache.remove(cache.size() - 1);
}
}
标签:10,结点,cache,java,ArrayList,路径,pathList,二叉树,root 来源: https://blog.csdn.net/weixin_39615182/article/details/112324907