剑指offer23-二叉树中和为某一值的路径
最近全国疫情严重,待在家里没事干,马上又要准备春招了,最近刷刷题,记录一下!再说一句,武汉加油,大家出门记得戴口罩!
1、题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
2、思路分析
首先思考节点值的和为输入的整数,每条路径都一定是从根节点到叶子节点,在数据结构中从根节点到叶子节点的遍历称之为深度优先遍历DFS。因此整个过程可以采用先序遍历方式的DFS,即根节点》左子树》右子树。随后考虑一次遍历完成后的处理,当一次遍历完成后,如果输入整数值恰好等于节点值之和,则输出这条路径并且回退一个节点;如果不等于则直接回退一个节点,即回退到当前节点的父节点,如果该父节点有右孩子,则继续遍历,否则继续回退。考虑回退到根节点,此时如果它有右孩子,则继续遍历,否则整个DFS结束。
3、代码
public class Solution {
ArrayList<ArrayList<Integer>> alist=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list=new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//判断边界
if(root==null)
return alist;
list.add(root.val);
if(root.val==target&&root.left==null&&root.right==null)
alist.add(new ArrayList<Integer>(list));
if(root.val<=target&&root.left!=null) {
FindPath(root.left,target-root.val);
}
if(root.val<=target&&root.right!=null) {
FindPath(root.right,target-root.val);
}
list.remove(list.size()-1);
return alist;
}
}