二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
(1)题中首先给出了一数组并要求判断是不是二叉搜索树的后序遍历结果,那么可知,如果他真的时一个二叉搜索树的后序遍历结果,那么对这个数组排序之后得到的一定是这个二叉搜索树的中序遍历结果。
(2)现在就相当于已知了一个二叉搜索树的中序和后序遍历结果。通过先序遍历和后序遍历的特点,此时后序序列的最后一个数一定是这个二叉树的根节点。在中序遍历的结果中找到这个根节点,则中序序列的根节点左右两边的序列分别是这个二叉树的左右子树的中的节点。
(3)而二叉搜索数的根节点一定小于它所有右子树的值,大于所有左子树的值,所以就循环判断一下是否符合,如果不符合这一条件则返回False。如果符合则
递归调用判断函数分别对左右子树进行(2)。
Python代码:
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if len(sequence) == 0: #如果长度为0返回False
return False
pre = sorted(sequence) #排序得到中序
root = sequence[len(sequence) - 1] #找到根节点
cur = 0 #记录根节点在中序中的位置
for count, num in enumerate(pre):
if num == root:
cur = count
break
for num in sequence[:cur]: #左子树中节点的判断
if num > root:
return False
for num in sequence[cur + 1:]: #右子树中节点的判断
if num < root:
return False
flag = True #flag记录左右子树判断的情况
if len(sequence[:cur]) != 0: #序列长度为0不需要判断
flag = self.VerifySquenceOfBST(sequence[:cur])
if len(sequence[cur + 1:] ) != 0:
flag = self.VerifySquenceOfBST(sequence[cur + 1:])
return flag
测试