题目描述:
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解题思路:
使用深度遍历的方法进行寻找路径,不过在深度遍历过程中,需要对路径坐上标记,传统的深度遍历无法区分初第一条路径之外后其他的路径,故使用两个栈。
代码(java):
import java.util.ArrayList;
import java.util.Stack;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
Stack <TreeNode> s=new Stack<TreeNode>();
Stack <TreeNode> sbak=new Stack<TreeNode>();
ArrayList res=new ArrayList();
if (root==null)return res;
s.push(root);
sbak.push(root);
int count=root.val;
ArrayList <Integer> item=new ArrayList<Integer>();
item.add(root.val);
while(s.empty()==false){
//如果节点之和小于target,继续深度遍历
if (count<target){
//优先左子树遍历左子树
if(s.peek().left!=null){
TreeNode top=s.pop();
TreeNode left=top.left;
top.left=null;
s.push(top);
s.push(left);
sbak.push(left);
item.add(left.val);
count+=left.val;
}
//若左子树为空,则遍历右子树
else if(s.peek().right!=null){
TreeNode top=s.pop();
TreeNode right=top.right;
top.right=null;
s.push(top);
s.push(right);
sbak.push(right);
item.add(right.val);
count+=right.val;
}
//若该节点为叶子节点,弹出,继续改节点父节点遍历
else{
s.pop();
sbak.pop();
count-=item.get(item.size()-1);
item.remove(item.size()-1);
}
}
else if(count==target)
{
if (sbak.peek().right==null && sbak.peek().left==null){
ArrayList <Integer>tmp=new ArrayList<Integer>();
for(int i=0;i<item.size();i++)
{
tmp.add(item.get(i));
}
res.add(tmp);
}
sbak.pop();
s.pop();
count-=item.get(item.size()-1);
item.remove(item.size()-1);
}
else if(count>target)
{
s.pop();
count-=item.get(item.size()-1);
item.remove(item.size()-1);
}
}
return res;
}
}