验证二叉查找树

本文介绍了一种通过递归算法验证二叉树是否为合法二叉查找树的方法,并提供了具体的Python实现代码。

题目描述:给定一个二叉树,判断它是否是合法的二叉查找树(BST)

一棵BST定义为:

1. 节点的左子树中的值要严格小于该节点的值。

2. 节点的右子树中的值要严格大于该节点的值。

3. 左右子树也必须是二叉查找树。

4. 一个节点的树也是二叉查找树。


之前,有一道验证平衡二叉树的问题(详见:点击打开链接),现在回过头看,那道题真的很值得好好学习借鉴,他既是典型的递归算法的应用,同时,也向我们展示了“树”的验证问题比较普遍的解法,而且很简单,总共就5行代码。

那么现在又遇到了一个树的验证问题,验证二叉查找树。基本逻辑与之前“平衡二叉树”是一致的,还是用递归,我们需要做的就是将题目中给出的四个条件放在递归的函数里面。

这里有一点需要注意,那就是1,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 binary tree.
    @return: True if the binary tree is BST, or false
    """  
    def isValidBST(self, root):

        if root is None:
            return True
        if root.left is None and root.right is None:
            return True

        if root.left:
            if not self.isValidBST(root.left):
                return False
            elif self.max_val(root.left) >= root.val:
                return False
            
        if root.right:
            if not self.isValidBST(root.right):
                return False
            elif self.min_val(root.right) <= root.val:
                return False

        return True

    def min_val(self, root):
        result = root.val
        while root.left:
             result = root.left.val
             root = root.left
        return result

    def max_val(self, root):
        result = root.val
        while root.right:
             result = root.right.val
             root = root.right
        return result
        # write your code here
后面两个函数是求取以root为根节点的二叉查找树的最大,最小值的。所以,调用的条件当然是先判断这棵树是二叉查找树。

不过个人感觉这样写还是效率不够高,不知道诸位有没有更高效的做法?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值