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

题目

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

实现

递归+回溯
思路:保存搜索路径,记录当前路径上所有元素的和。如果当前节点为叶子节点,并且当前节点值和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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值