您的位置:首页 > 职场人生

微软面试100题系列---在二叉树中找出和为某一定值的所有路径

2016-09-02 05:39 489 查看

题目

输入一个整数和一棵二叉树;从树的根节点开始往下访问一直到叶节点,所经过的所有节点形成一条路径。打印出和输入整数相等的所有路径。

实现

递归+回溯

思路:保存搜索路径,记录当前路径上所有元素的和。如果当前节点为叶子节点,并且当前节点值和sum和=data,则满足条件,打印后递归返回到父节点;如果不是叶子节点,则继续访问子节点;

当访问到某一节点时,把该节点的值添加到当前变量和sum中,且把该节点压入栈中;

若节点为叶子节点,且sum==期望的和,则打印出栈内容;

若节点不是叶子节点,继续访问左孩子节点和右孩子节点;

从栈中移除该节点,并从sum和中减去该节点的值(回溯);

代码实现:

import java.util.Stack;

public class Num4 {

public static int sum=0;

public static Stack stack=new Stack<BinaryTreeNode>();
public static Stack stack_2=new Stack<BinaryTreeNode>();

public static void main(String[] args) {
BinaryTreeNode root=null;

//create a binaryTree to test
root=createTree(root);

pathTree(root,22);
}

public static BinaryTreeNode createTree(BinaryTreeNode root){
root=new BinaryTreeNode(8);
BinaryTreeNode node=new BinaryTreeNode(5);
root.left=node;
node=new BinaryTreeNode(12);
root.right=node;
node=new BinaryTreeNode(7);
root.left.left=node;

return root;
}

public static void pathTree(BinaryTreeNode root,int value){
sum+=root.value;
stack.push(root);
if(root.left==null && root.right==null && sum==value){
printPath();
}
if(root.left!=null){
pathTree(root.left,value);
}
if(root.right!=null){
pathTree(root.right,value);
}
if(!stack.isEmpty())
{
stack.pop();
sum-=root.value;
}

}

private static void printPath() {
while(!stack.isEmpty()){
BinaryTreeNode node= (BinaryTreeNode) stack.pop();
stack_2.push(node);
}
while(!stack_2.isEmpty()){
BinaryTreeNode node=(BinaryTreeNode) stack_2.pop();
stack.push(node);
System.out.print(node.value+"     ");
}
System.out.println();
}
}

class BinaryTreeNode{
int value;
BinaryTreeNode left;
BinaryTreeNode right;

public BinaryTreeNode(int value){
this.value=value;
this.left=null;
this.right=null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐