【剑指offer】面试题33:二叉搜索树的后序遍历序列(Java)
找到右子树的最小值:从数组末尾开始,找到第一个比当前最大值小的元素,这个元素可能是右子树的最小值。 找到左子树的最大值:从数组开头开始,找到最后一个比当前最小值大的元素,这个元素可能是左子树的最大值。 递归检查子树:检查左子树和右子树是否分别满足后序遍历的条件。如果两者都满足,则整个数组是后序遍历的结果。 verifyPostorder:这是一个入口函数,首先检查数组是否为空,如果为空则返回 find:这是一个辅助函数,用于递归检查数组
发布日期:2021-04-30 21:00:46
浏览次数:445
分类:精选文章
本文共 1270 字,大约阅读时间需要 4 分钟。
为了判断一个整数数组是否是某个二叉搜索树的后序遍历结果,我们可以使用递归的方法,从数组的末尾开始识别右子树的最小值,并递归检查左子树和右子树是否满足后序遍历的条件。
方法思路
解决代码
class Solution: def verifyPostorder(self, postorder): if not postorder: return True return self.find(postorder, 0, len(postorder) - 1) def find(self, postorder, start, end): if start >= end: return True i = start j = end - 1 # 找最大的i,使得 postorder[i] < postorder[end] while i < end and postorder[i] < postorder[end]: i += 1 # 找最小的j,使得 postorder[j] > postorder[end] while j > start and postorder[j] > postorder[end]: j -= 1 if i >= j: return False return self.find(postorder, start, i - 1) and self.find(postorder, j + 1, end - 1)
代码解释
True,否则调用 find 方法进行递归检查。postorder 从 start 到 end 之间的子数组是否是后序遍历的结果。 - 从
start开始,向右找到第一个比postorder[end]小的元素的位置i。 - 从
end-1开始,向左找到第一个比postorder[end]大的元素的位置j。 - 如果
i和j位置重叠,说明无法分割,返回False。 - 否则,递归检查左子树(
start到i-1)和右子树(j+1到end-1)是否都满足后序遍历的条件。
通过这种方法,可以有效地判断给定的数组是否是某个二叉搜索树的后序遍历结果。
发表评论
最新留言
不错!
[***.144.177.141]2026年06月05日 01时11分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP二维数组转换为一维数组
2023-03-01
PHP二维数组重组
2023-03-01
PHP交换两个变量值
2023-03-01
php代码执行完整流程介绍
2023-03-01
PHP代码格式化工具phpcf常见问题解决方案
2023-03-01
PHP使用3DES算法加密解密字符串
2023-03-01
php使用memcached扩展的一个BUG
2023-03-01
PHP内核介绍及扩展开发指南—基础知识
2023-03-01
PHP写日志fwrite和file_put_contents的区别与性能
2023-03-01
PHP函数
2023-03-01
PHP函数__autoload失效原因(与smarty有关)
2023-03-01
PHP函数操作数字和汉字互转(100以内)
2023-03-01
PHP函数方法
2023-03-01
PHP删除指定目录下的所有文件和文件夹 | 删除指定文件
2023-03-01
php判断ip黑名单程序代码
2023-03-01
php判断复选框是否被选中的方法
2023-03-01
PHP判断指定目录下是否存在文件
2023-03-01
php判断数组是否为空
2023-03-01
PHP判断数组是否有重复值、获取重复值
2023-03-01