二叉查找树中搜索区间

题目描述:给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。

样例:如果有 k1 = 10 和 k2 = 22, 你的程序应该返回 [12, 20, 22].


递归+深搜的思路。之前,像类似于“二叉树的所有路径”(详见:点击打开链接)这样的问题用的也是这种思路。应该不会陌生了。


用一个结果列表result存储节点值,因为result中需要不断添加新元素,所以,为了方便,干脆再建立一个辅助函数helper(),helper()中,result作为一个参数存在,接收符合条件的节点值。


从根节点开始向叶子搜索,分三种情况:

1. 如果当前节点值在区间内,那么先别着急加入result,而是递归对这个节点的左孩子做同样的事,也就是处理这个节点的左子树,处理完毕后,再将这个节点值加入result,之后,递归处理这个节点的右子树。这样做的目的是要保证result按升序排列

2. 如果当前节点值大于k2(给出区间的上限),那就不用考虑这个节点的右子树了,递归处理左子树,当然,这个节点是不符合条件的,不用加入result

3. 如果当前节点值小于k1(给出区间的下限),与2中类似,自己脑补吧。


于是按照上面的思路,给出代码:

"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""
class Solution:
    """
    @param root: The root of the binary search tree.
    @param k1 and k2: range k1 to k2.
    @return: Return all keys that k1<=key<=k2 in ascending order.
    """
    def searchRange(self, root, k1, k2):
        result = []
        self.helper(root, k1, k2, result)
        return result

    def helper(self, root, k1, k2, result):
        if root is None:
            return

        elif root.val >= k1 and root.val <= k2:
            self.helper(root.left, k1, k2, result)
            result.append(root.val)
            self.helper(root.right, k1, k2, result)

        elif root.val > k2:
            self.helper(root.left, k1, k2, result)

        else:
            self.helper(root.right, k1, k2, result)
        # write your code here


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值