题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
后序遍历的最后一个元素是根节点,通过根节点将二叉搜索树划分为左右子树,比根小的属于左子树,当有比根大的元素把该元素及以后的元素归为右子树,并判断右子树中元素是否都符合二叉搜索树特点,比根值都大。
再对左右子树同样的操作,一步步划分,判断是否都符合二叉搜索树的特点。
代码实现
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
#二叉搜索树的特点,左子树小于右子树
if len(sequence)==0:
return False
root=sequence[-1] #后序遍历的最后一个元素是根节点
i=0
for node in sequence[:-1]:
if node > root:
break
i=i+1 #遍历左子树的节点个数
for node in sequence[i:-1]:
if node < root: #右子树中若存在节点小于根节点的,则不是二叉搜索树的后序遍历
return False
#判断左子树是否符合二叉搜索树的特点
left=True
if i >1:
left=self.VerifySquenceOfBST(sequence[:i])
#判断右子树是否符合二叉搜索树的特点
right=True
if i<len(sequence)-2 and left:
right=self.VerifySquenceOfBST(sequence[i+1:-1])
return left and right