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

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

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

递归:

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        def istrue(begin,end):
            if begin >= end:
                return True
            root = postorder[end]
            i = begin
            while root > postorder[i]:
                i += 1
            j = i
            while root < postorder[j]:
                j += 1
            return j == end and istrue(begin, i - 1) and istrue(i, end - 1)
        return istrue(0, len(postorder) - 1)

从 i 停下位置开始往上递增 j 防止极端情况倒数第二个比倒一大

辅助栈方法:

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        stack, root = [], float("+inf")
        for i in range(len(postorder) - 1, -1, -1):
            if postorder[i] > root://如果接受了大于当前root的值,返回False
                return False
            while stack and stack[-1] > postorder[i]:
                root = stack.pop()//找到那个可以接上左子树的根节点,以后的值不能超过他了
            stack.append(postorder[i])
        return True

思路:
每次值的变化都在从右子树到左子树的时候发生。说明当前值需要接在某个节点左边

【【【左 右 根】 【左 右 根】 根】 【【左 右 根】 【左 右 根】根】 根】
倒序遍历:根 -> 右 -> 左 每次发现值变小时,说明进入了当前最近根下的左子树,将右子树和根出栈找到当前根,进行判断。
根的遍历顺序:右 -》 根 -》 左
因为遇到左子树就会出栈当前根,每次先遍历出栈右子树的根,再遍历出栈中间的根,最后出栈左子树的根。
每次会残存左子树在栈里,在遍历左子树所在的更大右子树的兄弟左子树时,残存左子树一定比当前值大而出栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值