题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
python实现:
# -*- coding:utf-8 -*-
class Solution:
# 二叉排序树:中序遍历二叉排序树 是有序序列
# 本解法利用二叉排序树的特性:左子树都比根节点小,右子树都比根节点大
def VerifySquenceOfBST(self, sequence):
# write code here
if len(sequence) == 0:
return False
if len(sequence) == 1:
return True
# 最后一个节点肯定时根节点
# 找到第一个大于根节点的数的索引
i = 0
while i < len(sequence)-1:
if sequence[i] > sequence[-1]:
break
i += 1
# 此时i应指向第一个大于根节点的数
# i~n-1 全是大于根节点的数
for num in sequence[i:-1]:
if num<sequence[-1]:
return False
# 如果左边序列全是大于根节点的,即左边序列可能全是右子树上的点
# 或者全是小于根节点,即左边序列可能全是左子树上的点
if i==0 or i==len(sequence)-1:
return self.VerifySquenceOfBST(sequence[:-1])
return self.VerifySquenceOfBST(sequence[0:i]) and self.VerifySquenceOfBST(sequence[i:-1])
c++实现:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
return verify(sequence, 0, sequence.size()-1);
}
bool verify(vector<int> &sequence, int start, int end){
if((end-start+1)==0)
return false;
int root=sequence[end];
int leftEnd=start-2, rightStart=end;
for(int i=start;i<end;i++){
if(sequence[i]<root){
if(leftEnd!=start-2)//已经找到左子树终点,现在又遇到比跟小的数
return false;
}else{
if(rightStart==end){//还没找到右子树
rightStart = i;
leftEnd=i-1;//rightStart=0时leftEnd=-1,这也是为什么leftEnd初始化为2的原因
}
}
}
bool left=true;
if(leftEnd>=start)//有左子树
left = verify(sequence, start, leftEnd);
bool right=true;
if(rightStart<end)//有右子树
right = verify(sequence, rightStart, end-1);
return (left && right);
}
};