标签:
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
一道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]使用列表传递修改也是一种办法。
标签:
原文地址:http://www.cnblogs.com/sherylwang/p/5484732.html