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

本文介绍如何通过递归方法判断一个整数数组是否符合二叉搜索树的后序遍历特性,提供了一段Python代码实现。关键在于理解后序遍历的规律并运用在算法设计中。

题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。 如果是则返回 true,否则返回 false。

题解:
有如下一棵二叉搜索树:左节点值<根节点值<右节点值
这是一棵树
在这里插入图片描述

输入:[11,13,12,15,17,16,14,19,21,20,23,25,24,22,18]
输出:True
二叉搜索树后序遍历特点:
1.构成:左子树(所有值比根节点小)+右子树(所有值比根节点大)+根节点
递归方法:
1.结束条件: i >= j,说明只有一个节点或者没有节点,无需进行迭代,直接返回True.
2.确定搜索区间 [i,j],并设置一个移动游标p,list[j]是根节点。
3.移动游标p,寻找第一个大于list[j]的节点位置,设为m
4.将整个list分成 [i,m-1] (右子树)+[m,j-1] (左子树)+[j] (根节点)
5.右子树已经判断为正确的后序遍历结果,只需要判断左子树区间的值是否都大于根节点(判断左子树部分是否为后序遍历结果)
6.返回值:
p == j 判断子树正确
recur(i, m - 1) 判断左子树区间是否正确
recur(i, m - 1) 判断右子树区间是否正确

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        def recur(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 recur(i,m - 1) and recur(m, j - 1)
        return recur(0,len(postorder) - 1)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十子木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值