题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list=new ArrayList<Integer>();//都定义为全局变量
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return result;
traverse(root,target,0);
return result;
}
public void traverse(TreeNode root,int target,int num)
{
if(root==null)
return;
num+=root.val;
list.add(root.val);
//分为三种情况,但都要做list.remove(list.size()-1);return;操作
if(root.left==null&&root.right==null&&num==target)
{
result.add(new ArrayList<Integer>(list));
list.remove(list.size()-1);
return;
}
if(root.left==null&&root.right==null&&num!=target)
{
list.remove(list.size()-1);
return;
}
traverse(root.left,target,num);
traverse(root.right,target,num);
list.remove(list.size()-1);
return;
}
}
犯的错:递归结束条件错误、返回上一层前未对list做处理、未使用new ArrayList<Integer>(list)
重点:
1、先序遍历
2、不建议将 判断节点是否为空 作为递归结束条件
3、不能以 root==null&&num==target 作为递归结束的条件,因为叶子结点的左右节点都为空,如果路径和等于给定整数时会向result内重复添加两次,如
public void traverse(TreeNode root,int target,int num)
{
if(root==null&&num==target)
{
result.add(new ArrayList<Integer>(list));
return;
}
num+=root.val;
list.add(root.val);
.........
}
4、递归涉及参数时,不需做后续操作;递归涉及到全局变量时,需要做后续操作
如num一直是作为参数传递的,而且不是引用类型,因此下一层中对num的改变不会影响本层的num,因此在返回上一层之前不需要对num进行处理
而list是一个全局变量,而且是引用类型,因此下一层中对list的改变会影响本层的list,因此在返回上一层之前需要对list进行处理:list.remove(list.size()-1);
5、
使用result.add(new ArrayList<Integer>(list))以防止result内的值随list变化而变化