输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
提示:
数组长度 <= 1000
class Solution:
def verifyPostorder(self, postorder: List[int]) -> bool:
# 二叉搜素树的性质
# 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树
if postorder is None or postorder == []:
return True
# print(postorder)
root_val = postorder[-1]
# print(root_val)
# 数组中第一个大于跟节点的索引
index = -1
for i in postorder:
index += 1
if i > root_val:
break
# print(index)
# 获取根节点的左节点后序遍历序列
# print(postorder[:index])
left_node = postorder[:index]
# 获取根节点的右节点后序遍历 的序列
# print(postorder[index:-1])
right_node = postorder[index:-1]
# 遍历right_node中的成员,如果小于于根节点值的情况,则说明是异常的。
for i in right_node:
if i < root_val:
return False
# 左,右子树也是搜索二叉树,递归调用
if self.verifyPostorder(left_node) == False:
return False
if self.verifyPostorder(right_node) == False:
return False
return True