输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
首先确定二叉搜索树的定义:
二叉查找树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树:
1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3.它的左、右子树也分别为二叉排序树。
换句话说,在没有结点,只要它有子结点,就是左结点的值小于根结点的值大于右结点的值。
根据二叉搜索树的数值排序特点,中序遍历(根左右)遍历二叉搜索树会得到有序的序列。
思路:首先后序遍历的特征就是序列的结尾总是根结点,根据二叉搜索树的特征,对于一个根结点它的左子树小于它,它的右子树大于它。也就是说从序列中弹出根结点之后,剩下的就是它的左右子树的全部结点,如果它是二叉搜索树,把根结点就能插入进去,左面都是比它大的,右面都是比它小的。
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
# 只有第一次根结点为空是False
# 所以判断子树的时候,要保证sequence不是空
if not sequence:
return False
if len(sequence) == 1:
return True
i=0
length = len(sequence)
# 找出左子树
while sequence[i] < sequence[-1]:
i+=1
# 找出左子树之后,理应剩下的都是右子树,也就是都比根结点大的。
# 所以在剩下的结点里如果出现小于的就不是平衡二叉树
for j in range(i,len(sequence)-1):
if sequence[j] < sequence[-1]:
return False
# 如果满足条件,就把左右子树切分出来
left_s = sequence[:i]
right_s = sequence[i:length-1]
# 这块是不能直接返回self.VerifySquenceOfBST()左右子树的返回结果的与
# 因为对于第一次根结点为空,那空树就不是搜索树
# 对于子树是空树,判断应该是为真,所以这里需要判断子树序列是不是空
# 并且用标志变量,存储结果
left, right = True, True
if len(left_s) > 0:
left = self.VerifySquenceOfBST(left_s)
if len(right_s) > 0:
right = self.VerifySquenceOfBST(right_s)
return left and right