python--剑指offer--33. 二叉搜索树的后序遍历序列

python--剑指offer--33. 二叉搜索树的后序遍历序列_第1张图片
python--剑指offer--33. 二叉搜索树的后序遍历序列_第2张图片
python--剑指offer--33. 二叉搜索树的后序遍历序列_第3张图片
在这里插入图片描述

class Solution_:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        def resur(i, j):
            if i >= j:
                return True
            p = i
            while postorder[p] < postorder [j]:
                p += 1
            
            m = p
            while postorder[p] > postorder[j]:
                p += 1
            
            return p == j and resur(i, m-1) and resur(m, j-1)
        
        return resur(0, len(postorder)-1)

python--剑指offer--33. 二叉搜索树的后序遍历序列_第4张图片
python--剑指offer--33. 二叉搜索树的后序遍历序列_第5张图片
python--剑指offer--33. 二叉搜索树的后序遍历序列_第6张图片
python--剑指offer--33. 二叉搜索树的后序遍历序列_第7张图片
在这里插入图片描述

from typing import List


class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        stack = []
        root = float("inf")
        for i in range(len(postorder)-1, -1, -1):
            # (1) 判段postorder[i]是否为刚找到的双亲结点的左孩子结点,root一定大于postorder[i]
            # (2) 判断postorder[i]是否为最近找到的root的左孩子的右子树中的结点,root一定大于postorder[i]
            # (3) 不符合以上两种情况即root < postorder[i]是说明不是二叉搜索树,返回False
            if root < postorder[i]:
                return False  # 判断不成功说明不是二叉搜索树,返回False
            
            while stack and stack[-1] > postorder[i]:
                # 当postorder[i]为左孩子时,需要找到该结点的双亲结点。
                # 当退出循环时,root为postorder[i]的双亲结点
                root = stack.pop()

            stack.append(postorder[i])
        return True

补充:
以下讨论都是在后序遍历序列中,编程时使用的是后序遍历的倒序
1、
当r[i]

  • 有两种情况:
    • (1) r[i]没有右兄弟结点,r[i+1]是r[i]的双亲结点
    • (2) r[i]有右兄弟结点,r[i+1]是r[i]的右兄弟结点为根的子树的最左下端的结点
  • 不论(1)还是(2)又有两种情况:
    • (3) r[i]的双亲结点是某个结点的左孩子结点
    • (4) r[i]的双亲结点是某个结点的右孩子结点
  • 不论(3)还是(4),在相应的后序遍历序列中,r[i]的双亲结点都位于r[i]的右侧,且是r[i]右侧中所有大于r[i]的元素的最小元素

2、

后序遍历序列中,当r[i]>r[i+1]时,r[i+1]一定是r[i]的右孩子

3、

判断失败的条件:

  • 找到左孩子的双亲结点,然后判断截至到下一个左孩子的所有结点是否都小于该左孩子的双亲结点,小于则是二叉搜索树继续运行,否则,返回False.

截至到下一个左孩子的所有结点:

  • r[i-k-1],r[i-k],…r[i-1],r[i],其中r[i-k],…r[i-1]是截至到下一个左孩子的所有结点,r[i-k-1]下一个左孩子结点。

你可能感兴趣的:(#,剑指offer--python,python,python,leetcode,二叉搜索树的后序遍历序列)