判断序列是否为二叉排序树的后序遍历 python
题目:给定一个序列,判断其是不是一颗二叉排序树的后序遍历结果
分析:首先要知道什么是排序二叉树,二叉排序树是这样定义的,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点
因此,二叉排序树按照“左-右-根”的顺序遍历得到的序列具有这样的特点:该序列从中间分开,左边序列的值都小于序列的最后一个值,右边序列的值都大于序列的最后一个值。很明显,序列的最后一个值就是根节点,而这个分界点就是左右子树的分界点,因此,我们按顺序遍历这个序列,找到第一个大于根节点的值,就区分出了左右子树,同时,如果这个点左边的值大于根节点的值或者该点右边的值小于根节点的值,则说明此序列不符合要求,如果符合要求,则继续对左右子树按照上面的过程进行判断,明显这是个需要用递归解决的问题。
判断的代码:
class Solution:
#判断序列是否是二叉排序树的后续遍历序列
def VerifySquenceOfBST(self, sequence):
if len(sequence)==0:
return False
if len(sequence)==1:
return True
root=sequence[-1]#根节点的值
border=len(sequence)-1#必须初始化边界点的值,因为有可能没有右子树,就无法按照第一个大于root的方法找到border
for i in range(len(sequence)-1):
if sequence[i]>root:
border=i
break
for i in range(len(sequence)-1):#边界点左边的值小于root,右边的值大于root
if sequence[i]<root and i>border:
return False
if sequence[i]>root and i<border:
return False
if border==len(sequence)-1 or border==0:#没有左子树或没有右子树
return self.VerifySquenceOfBST(sequence[:-1])
else:
return (self.VerifySquenceOfBST(sequence[:border]) and self.VerifySquenceOfBST(sequence[border:len(sequence)-1]))
在判断的过程中要注意,按照第一个大于root的方法寻找边界有可能或找不到,此时右子树是不存在的,因此要对border进行初始化,另外对左子树或右子树不存在的情况要特殊处理。