题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路一:非递归
左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的最后一个数字是右子树的根,他也比左子树所有值大,因此我们可以每次只看右子树是否符合条件即可。
即使到达了左子树,左子树也可以看出由左右子树组成的树,还像右子树那样处理。
对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小,可以暂时把他看出右子树的左子树。
只需看看右子树的右子树是否符合要求即可。
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
size=len(sequence)-1
if len(sequence)==0:
return False
if len(sequence)==1:
return True
i=0
while(size!=-1)://看右子树的右子树
while(sequence[i]<sequence[size])://左子树
i+=1
while(sequence[i]>sequence[size])://右子树
i+=1
if i<size://最终的i=size
return False
size-=1//往前
i=0
return True
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0) return false;
if(sequence.length==1) return true;
int size=sequence.length-1;
int i=0;
while(size!=-1){
while(sequence[i]<sequence[size]) i++;
while(sequence[i]>sequence[size]) i++;
if (i<size) return false;
size--;
i=0;
}
return true;
}
}
思路二:递归
在后序遍历得到的序列中,最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根结点的值小;第二部分是右子树结点的值,它们都比根结点的值大。
因此,我们可以总结出算法步骤:
Step1.通过取出序列最后一个元素得到二叉搜索树的根节点;
Step2.在二叉搜索树中左子树的结点小于根结点,因此可以遍历一次得到左子树;
Step3.在二叉搜索树中右子树的结点大于根结点,因此可以继续遍历后序元素得到右子树;
Step4.重复以上步骤递归判断左右子树是不是二叉搜索树,如果都是,则返回true,如果不是,则返回false;
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if len(sequence)==0:
return False
if len(sequence)==1:
return True
return self.verify(sequence,0,len(sequence)-1)
def verify(self,sequence,start,end):
if(start>=end):
return True
i=start
while(sequence[i]<sequence[end]):#sequence[end]是根节点
i+=1#找到左子树最后一个节点,i-1
for j in range(i,end):
if(sequence[j]<sequence[end]):#如果右子树有小于根节点的就False
return False
break
return self.verify(sequence,start,i-1) and self.verify(sequence,i,end-1)