题目要求:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。
由题意可得:
1. 后序遍历序列的最后一个元素为二叉树的根节点;
2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。
算法步骤如下:
1. 找到根结点;
2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
4. 分别递归判断左/右子序列是否为后序序列;
其中在判断start<=end的时候是都需要判断
1)取到start==end时说明剩下的元素为1个,肯定是符合后序遍历,就直接返回true
2)须判断start>end的情况,这种情况是没有左子树,只有根节点和一个右节点(只有两个元素)的情况,此时再递归左子树的时候,此时传入的end=start-1,此时的因为之前已经判断了右子树符合条件,此时就直接返回true
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
def helper(sequence,start,root):
if start>=root:
return True
rootval=sequence[root]
ind=0
for i in range(start,root):
if sequence[i]>rootval:
for j in range(i,root):
if sequence[j]<rootval:
return False
break
return helper(sequence,start,ind-1) and helper(sequence, ind, root-1)
if sequence==[]:
return False
return helper(sequence,0,len(sequence)-1)