Interview100-4 二叉搜索树中寻找元素和为给定值的路径

题目

输入一个整数n和一个二叉搜索树。从数的根节点开始向下访问子节点直到叶子结点所经过的所有节点形成一条路径。在给定的二叉搜索树中寻找和为给定值n的所有路径。

例如输入整数22,如下的二叉搜索树:

    10
    /\
   5  12
  /\  
 4  7

则打印出两条满足条件的路径:10-5-7 和 10-12

解法

思想:由于还是树形结构,因此可以想到递归+回溯的方法。手动维护一个stack,存储从根结点到叶子节点的遍历的路径,如果和为指定的数字,则打印路径。如果不是则返回上层节点继续寻找到其他叶子节点。伪代码如下;

二叉搜索树的节点结构:

BSTreeNode {
    int value;
    BSTreeNode left;
    BSTreeNode right;
}

算法伪代码:

FIND-SUM-PATH(BSTreeNode root, int sum):
    int path[Tree.height]; // 使用数组模拟stack的功能
    BACK-TRACK-PATH(root, sum, path, 0);

BACK-TRACK-PATH(BSTreeNode root, int sum, int[] path, top):
    path[top++] = root.value;
    sum -= root.value;
    if root.left == null and root.right == null // 如果已经到达叶子节点
        if sum == 0
            PRINT-PATH(path, top);

    else // 否则进行递归
        if root.left != null
            BACK-TRACK-PATH(root.left, sum, path, top);
        else 
            BACK-TRACK-PATH(root.right, sum, path, top);
    top--; 
    sum += root.value;

PRINT-PATH(int[] path, int top):
    for i = 0 to top:
        print path[i]
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值