验证二叉查找树

来源:互联网 发布:微信三级分销拼团源码 编辑:程序博客网 时间:2024/06/03 22:11

题目描述:给定一个二叉树,判断它是否是合法的二叉查找树(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为根节点的二叉查找树的最大,最小值的。所以,调用的条件当然是先判断这棵树是二叉查找树。

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

0 0
原创粉丝点击