后续 [左子树区,右子树区,根]
二叉搜索树 严格满足 左子树区<根<右子树区
因为不能保证数组是满足 左子树<根<右子树的
所以需要从头开始依次遍历
特殊情况:
只有一个root的后续 True
否则 需要划分左右子树区
先确定 根root为post[-1]
我们在[:-1]上 找第一个比根大的节点 此节点为右子树区开端
之后 继续遍历 如果在右子树区找到比root小的 则false
如果没有比root大的 再判断左子树和右子树是不是也是二叉搜索树
上述的寻找有下面几种可能
1、第一个就比根大 很好 左子树区变为空list 右子树区变为[:-1]
此时继续遍历 先看是否有比root小的 然后判断右子树区是不是二叉搜索树
2、没有比根大的 即右子树区为空
此时只需要判断左子树区 是不是二叉搜索树即可
3、找到比根大的第一个数 在中间
则继续寻找 如果右子树区不存在比根小的
则判断左右子树是不是二叉搜索树
class Solution:
def verifyPostorder(self, postorder: List[int]) -> bool:
#print(postorder)
if len(postorder) <= 1:
return True
root = postorder[-1]
rindex = None
for i in range(len(postorder)-1):
if postorder[i] < root:
if rindex != None:
return False
else:
continue
elif postorder[i] >root:
if rindex == None:
rindex = i
else:
continue
if rindex == None:
return self.verifyPostorder(postorder[:-1])
return True if self.verifyPostorder(postorder[:rindex]) and self.verifyPostorder(postorder[rindex:-1]) else False