class Solution:
def verifyPostorder(self, postorder: List[int]) -> bool:
#如果为空或者长度是1,返回True
if not postorder or len(postorder)==1:
return True
#找到根节点
root = postorder[-1]
#找到左右子树的临界点
for i in range(len(postorder)):
if postorder[i]>=root:
break
#左子树
left = postorder[:i]
#右子树
right = postorder[i:len(postorder)-1]
#如果右子树有节点是小于根节点的的直接返回False
for i in right:
if i<root:
return False
#然后递归的判断左右子树就可以了
if self.verifyPostorder(left) and self.verifyPostorder(right):
return True
else:
return False
- 给定一个列表,判断这个列表是不是二叉搜索树的后序遍历
- 这个问题就要定位什么是搜索二叉树的后续遍历,左子树+右子树+根节点
- 先判断这个列表是不是为空
- 然后找到根节点,并且找到左右子树的界限,然后找到左子树和右子树
- 判断右子树的节点是不是都大于根节点,如果不是就直接返回false,否则递归的进行判断
- 递归的判断左子树和右子树是不是二叉搜索树的后序遍历序列