码迷,mamicode.com
首页 > 其他好文 > 详细

Validate Binary Search Tree

时间:2016-05-13 07:33:14      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node‘s key.
  • The right subtree of a node contains only nodes with keys greater than the node‘s key.
  • Both the left and right subtrees must also be binary search trees.

一道medium的题目,考察二叉搜索树是否合格。一种直接的思路是根据题意,判断结点左子树的值是否都小于结点的值,结点的右子树的值是否都大于结点的值。

但是这种两重判断十分麻烦,另外一种思路也是我拿到题目最先想到的,二叉搜索树在中序遍历时返回的是一个非递减序列,在本题的意思:是一个递增序列。所以只需保存中序遍历前一个结点的值,比较当前结点的值是否大于前一个结点的值。只需要稍微修改中序遍历的代码,就可以实现,先给出一个利用栈的迭代解法,时间复杂度O(n),空间复杂度O(1),代码如下:

class Solution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if not root:
            return True
        stack = []
        prev = None
        cur = root
        while stack or cur:
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack.pop()
                if prev!=None and prev >= cur.val:
                   return False
                prev = cur.val
                cur = cur.right
        return True

第二种递归实现,虽然递归空间复杂度高,但是确实更简洁,另外我对递归的运用技巧还不够,以后多写递归解法,??:

class Solution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        self.prev = None
        return self.helper(root)
        
    def helper(self,node):
        if not node:
            return True
        if not self.helper(node.left):
            return False
        if self.prev!=None and self.prev >= node.val:
            return False
        self.prev = node.val
        
        return self.helper(node.right)

 

注意这种解法,prev在递归时是需要修改的。比如一开始根结点调用是self.prev = None, 但是根结点调用左子树,最后返回的是左子树的最大值,此时再拿回来跟根结点的值做比较,当然显示返回也是可以的,但是如果可以在递归过程中就修改prev的值,且在后续递归调用中能使用这种修改是极好的。self.prev 是一种共享修改的方法,另外prev=[None]使用列表传递修改也是一种办法。

Validate Binary Search Tree

标签:

原文地址:http://www.cnblogs.com/sherylwang/p/5484732.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!