题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
利用二叉树的前序遍历,把每一个遍历到是根节点保存在一个 list 中。然后判断当前节点是不是叶节点,若不是叶节点,则用递归的方式接着遍历它的左节点和右节点;
若是叶节点则判断从根节点到这个叶节点的路径和等不等于 target,如果相等就把这条路径对应的 list 添加进 listAll 中,如果不相等就回退到根节点接着遍历尝试新的路径。
测试用例:
- 功能测试:二叉树中有一条或多条符合的路径;二叉树中没有符合的路径。
- 特殊测试:输入的根节点为空。
public class test_thirty_four {
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target){
if (root == null)return listAll;
list.add(root.val);
target = target - root.val;
if (target == 0 && root.left == null && root.right == null){
//这里必须要重新生成一个对象实例,并使用list对其初始化赋值
listAll.add(new ArrayList<Integer>(list));
}
FindPath(root.left,target);
FindPath(root.right,target);
//模拟了栈回退,当前节点为叶子节点或者已经访问过的情况下,回溯到父节点
list.remove(list.size()-1);
return listAll;
}
}
方法二:(常规做法:利用栈)
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
ArrayList<ArrayList<Integer>> pathList = new ArrayList<ArrayList<Integer>>();
if(root==null)
return pathList;
Stack<Integer> stack=new Stack<Integer>();
FindPath(root,target,stack,pathList );
return pathList;
}
private void FindPath(TreeNode root, int target,
Stack<Integer> path,
ArrayList<ArrayList<Integer>> pathList) {
if(root==null)
return;
if(root.left==null&&root.right==null){
if(root.val==target){
ArrayList<Integer> list=
new ArrayList<Integer>();
for(int i:path){
list.add(new Integer(i));
}
list.add(new Integer(root.val));
pathList.add(list);
}
}
else{
path.push(new Integer(root.val));
FindPath(root.left, target-root.val, path, pathList);
FindPath(root.right, target-root.val, path, pathList);
path.pop();
}
}
}