题目:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
输入:
二叉排序树序列:8,2,7,10. 节点和:17
输出结果:
7 2 8
解题思路:
用递归的方式前序遍历从根节点往下寻找,每次向下寻找,我们就把找过的节点放入一个栈里面,并且用一个节点累加该节点的值,如果该值等于要找的整数和,并且是叶节点,我们就打印路径。如果不是叶节点,我们继续用以上的方法处理他的子节点,当访问节点结束以后,我们要让该节点出栈,并且减去累加的值。
Java代码实现:
static int current;
static Stack<Integer> intStack=new Stack<Integer>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeNode node=new TreeNode();
node.insert(8);
node.insert(2);
node.insert(7);
node.insert(10);
findPath(node.root, 17);
}
static void findPath(Node node,int result){
if(node==null){
return ;
}
current+=node.data;
intStack.push(node.data);
//是否为叶子节点
boolean isLeaf=(node.leftChild==null && node.rightChild==null);
//如果为叶子节点并且等于路径等于结果
if(isLeaf && current==result){
while(!intStack.empty()){
System.out.print(intStack.pop()+" ");
}
return;
}
//不为叶子树,则遍历子树
if(node.leftChild!=null){
findPath(node.leftChild, result);
}
if(node.rightChild!=null){
findPath(node.rightChild, result);
}
//出栈并且返回父节点
if(!intStack.empty()){
current-=node.data;
intStack.pop();
}
return;
}