(python version) 劍指offer 33. 二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
來源:力扣(LeetCode)
在这里插入图片描述

解题思路

遍历概念
  • 当输入的 List 值为空的时候,返回 True
  • 后序遍历的顺序:小大中
  • List 列表的最后一个数字为根节点( 小:左子; 大:右子; 中:根节点)
  • 算法时间为 O(logN) ,依序判断将 List 序列分为左子树与右子树
  • 仅需判断右子树序列的原因为:在前一步骤寻找左右子树的分节点时,已将小于 root 的值归为左子树。
  • [Reminder] 递归解法很容易鬼打墙,真的迷路的时候,记得参考其他人的写法。 像这题鬼打墙很久。
    • 写了子函数判断左、右子树的时候,条件限制变得越来越多。
    • 以及一种想把 List 变成 Queue 的偏执。其实 queue.popleft() 在python当中等同于 list.pop(0) ; queue.pop() 等同于 list.pop()
二叉搜索树的定义
  • 在二叉搜索树中:
    • 若任意节点的左子树不为空,则左子树上所有节点的值均不大于它的根节点值。
    • 若任意节点的右子树不为空,则右子树上所有节点的值均不小于它的根节点值。
    • 任意节点的左、右子树也分别为二叉搜索树

Python代码

class Solution:
    def verifyPostorder(self, postorder):
        if not postorder:
            return True
        root = postorder.pop()
        num  = len(postorder)
        
        i = 0
        # 分成左子树跟右子树,左子树的值皆小于根节点
        while i<num and postorder[i] < root:
            i+=1
        left  = postorder[:i]
        right = postorder[i:]
        
        # 检查右子树的点是否皆大于根节点
        for num in right:
            if num < root:
                return False
        return self.verifyPostorder(left) and self.verifyPostorder(right)    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值