描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜索树)
示例1
输入:
[4,8,6,12,16,14,10]
返回值:
true
解题分析
知识点复习:
二叉搜索树:左子树<根<右子树
后序遍历:左子树→右子树→根
解题思路:
这棵树的后序遍历是第一行不是第二行:
所以,数组的最后一位一定是根节点
得保证所有左子树小于根节点,所有右子树大于根节点
所有左子树的左子树小于左子树的根节点,所有左子树的右子树大于左子树的根节点
所有右子树的左子树小于右子树的根节点,所有右子树的右子树大于右子树的根节点
并且左右子树数量加和等于节点总数
如果没有走完就找到两个左右链表,肯定是错误的。。所以图中第二种很可能就会造成计数错误!
因为涉及到数组的划分操作,直接存为链表方便一些~
代码
import java.util.*;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
List<Integer> list = new ArrayList<>();
if(sequence.length<1){
return false;
}
for(int num=0;num<sequence.length;num++){
list.add(sequence[num]);
}
return VerifyBST(list);
}
public boolean VerifyBST(List<Integer> sequence){
if(sequence.size()<1){
return true;
}
int len = sequence.size();
int mid = sequence.get(len-1);
List<Integer> left = new ArrayList<>();
List<Integer> right= new ArrayList<>();
int i =0;
while(sequence.get(i)<mid){
left.add(sequence.get(i));
i++;
}
while(sequence.get(i)>mid){
right.add(sequence.get(i));
i++;
}
if(i<sequence.size()-1){
return false;
}
return VerifyBST(left)&&VerifyBST(right);
}
}
递归思想可以多多练习一下,树之类的真的好喜欢用递归。。。