版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MMChinaMM/article/details/52131061
声明:本片文章为阅读何海涛网易日志后,自己用java实现后的学习总结。
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
思路:先寻找从根节点到叶子节点的所有路径,将这些节点压进栈中,当遇到叶子节点时,判断sum是否为0,如果为0,则逆序输出栈中的节点的值,即为要求的输出。
如果遇到的不是叶子节点,则先将左节点压栈,并改变相应的sum。左节点判断完后,将左节点出栈,并相应的修改sum,开始判断右子树。当右子树判断完成后,该树检测完成。
何海涛的网易日志:http://zhedahht.blog.163.com/blog/static/254111742007228357325/
代码:
/**
* 题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
* @author hongbin.gao
*
*/
public class FindPath {
public static void main(String[] args){
//本测试用例和何海涛中的测试用例相同。
TreeNode root = new TreeNode(10);
TreeNode p1 = new TreeNode(5);
TreeNode p2 = new TreeNode(12);
TreeNode p3 = new TreeNode(4);
TreeNode p4 = new TreeNode(7);
root.left = p1; root.right = p2;
p1.left = p3; p1.right = p4;
p2.left = p2.right = null;
p3.left = null; p3.right = null;
p4.left = p4.right = null;
Stack<TreeNode> stack = new Stack<TreeNode>();
int sum = 22;
if(root == null && sum ==0)
return ;
else{
stack.push(root);
sum -= root.val;
findPath(sum,stack);
}
}
public static void findPath(int sum, Stack<TreeNode> stack){
TreeNode pNode = null;
if(sum == 0 && stack.peek().left == null && stack.peek().right == null){ //如果sum==0,并且到达叶节点,准备输出
Stack<TreeNode> temp = new Stack<TreeNode>();
while(!stack.isEmpty()){
TreeNode p = stack.pop();
temp.push(p);
}
while(!temp.isEmpty()){
TreeNode p = temp.pop();
if(!temp.isEmpty())
System.out.print(p.val + ",");
if(temp.isEmpty())
System.out.println(p.val + ";");
stack.push(p);
}
return ;
}
if(sum != 0 && stack.peek().left == null && stack.peek().right == null) //如果已经到达叶节点,但是sum!=0,则直接返回,不做处理。
return ;
if(stack.peek().left != null){ //如果不是叶节点,并且存在左子树。
pNode = stack.peek().left;
sum -= pNode.val;
stack.push(pNode);
findPath(sum,stack);
sum += pNode.val;
stack.pop();
}
if(stack.peek().right != null){ //如果存在右子树,则进行右子树的递归
pNode = stack.peek().right;
sum -= pNode.val;
stack.push(pNode);
findPath(sum,stack);
sum += pNode.val;
stack.pop();
}
return ;
}
}