题解 | #二叉搜索树的后序遍历序列#
二叉搜索树的后序遍历序列
https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param sequence int整型一维数组
# @return bool布尔型
#
class Solution:
def VerifySquenceOfBST(self , sequence: List[int]) -> bool:
# write code here
# 先判空
if not sequence:
return False
# 找出后序遍历的根节点
len_list = len(sequence)
root = sequence[len_list-1]
index = 0
# 找出左右子树的右子树分界节点
for i in range(len_list):
# 注意边界条件,是大于等于 都可以是右子树
if sequence[i]>=root:
index = i
break
# 判读分界点右边是否满足二叉搜索树的条件,即右子树全大于等于根节点
# 注意这里不能
for i in range(index, len_list):
if sequence[i]<root:
return False
# 使用一个flag判断左右子树是否满足,分割的只去除根节点,index要包含进去
# 注意index是不是首个或者倒数第二个元素,如果是则不要分割
f_left = True
if index>0:
# 要记得在if中更新标志的状态
f_left = self.VerifySquenceOfBST(sequence[:index])
f_right =True
if index < len_list-1:
f_right = self.VerifySquenceOfBST(sequence[index:-1])
return f_left and f_right
根节点就是数组的最后一位,所以
- 第一步:找到数组最后一位,即根节点root。紧接着
- 第二步:获取整个数组的长度,开始遍历并与root值比较,第一个大于root的值就是左右子树的分界点。
- 第三步:遍历右子树,验证是否符合二叉搜索树的概念;如上图,以12为分界点的右边所有节点都是大于root的,所以是符合二叉搜索树的。
- 第四步:继续往下递归,查看余下的左右子树是否符合。
剑指offer刷题笔记 文章被收录于专栏
24秋招剑指offer刷题的笔记

