剑指 Offer 33. 二叉搜索树的后序遍历序列

后续遍历判断二叉搜索树是否合法

  1. 二叉搜索树的性质,它左子树的元素都小于根节点,右子树的元素都大于根节点
  2. 所以我们可以根据根节点的大小将二叉搜索树分为左子树和右子树
  3. 因为是后序所以左子树在前,又根据性质,左子树的所有元素都小于根节点
  4. 我们找到第一个大于根节点的元素,它之前是左子树,它之后不包括根节点是右子树
  5. 我们再对左右子树进行这样的判断
  6. 结束条件是1 遍历完了整个数组。2右子树不符合(根据我们假设划分的左子树一定是符合的)
 def verifyPostorder(self, postorder):
        """
        :type postorder: List[int]
        :rtype: bool
        """
        def recur(l,r):
            if l >= r:
                return True
            idx = l                                   
            while postorder[idx] < postorder[r]:     #找到第一个大于根节点的元素,它之前是左子树,它之后不包括根节点是右子树
                idx += 1
            tmp = idx                                #
            while tmp < r:
                if postorder[tmp] < postorder[r]:    #看看右子树部分是否满足
                    return False
                tmp += 1
            return recur(l,idx-1) and recur(idx,r-1) #递归判断所以子树
        return recur(0,len(postorder)-1)

单调栈,对后序进行逆序变成根右左,左子树的根节点离root最近

def verifyPostorder(self, postorder):
    """
    :type postorder: List[int]
    :rtype: bool
    """
    stack = []
    root = 0x3f3f3f3f
    for i in range(len(postorder)-1,-1,-1):  #逆序应该是根右左
        if postorder[i] > root:
            return False
        while stack and postorder[i] < stack[-1]:  #第一次时stack【-1】是根节点
            root = stack.pop()                     #左子树的根节点应该离root最近!!!
        stack.append(postorder[i])                  #
    return True 

你可能感兴趣的:(单调栈,二叉搜索树,递归,数据结构)