剑指offer java版 test23—二叉搜索树
题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同
知识点:
- 二叉搜索树的含义:
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。(源于百度百科)
- 和下面代码有关的,数组为空的判断
判断数组是否为空的代码:
if(array == null || array.length == 0)
return true;
array == null:表示数组为空
array。length==0:表示array=【】;
二维数组为空的判断:
if((arraynull||array.length0)||(array.length1&&array[0].length0))
array.length==1 && array[0].length == 0:行为1,列为0,表示 array = {{}}
思路:后序遍历,左子树在前,右子树在中,根节点在尾部。由于又是二叉搜索树。所以我们可以从数组中提出根节点的值,通过比较大小,划分左右子树,再递归,一个一个的判断。
在题目讨论区中,Mark马克大佬的笔记:
BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x(也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义
链接:链接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd?f=discussion
代码:
我写了 没大佬们整洁明了,大佬们又再写了个函数,调用起来方便快捷,便于解决输入为【】的情况。此次写代码的过程中,疯狂出现数组越界的情况,以后一定多引以为戒。
package cn.test23;
/*
用递归来做
*/
import java.util.Arrays;
public class test {
public static void main(String[] args){
Solution sl=new Solution();
int[] sequence={2,9,5,16,17,15,19,18,12};//二叉树后序遍历结果
System.out.println(sl.VerifySquenceOfBST(sequence));
}
}
class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
//如果初始数组为空,则返回false(这里只用于初始数组的判断,因为后面递归时,都保证了数组不为空)
if(sequence==null||sequence.length<=0){
return false;
}
boolean left=true;//判断左子树是否可能是后序遍历的标志位
boolean right=true;//判断右子树是否可能是后序遍历的标志位
int size=sequence.length;//记录sequence的位置
if(size==1){
return true;
}
int root=size-1;//根节点的位置
int numble=0;//记录左子树和右子树分开的位置
int i=0;
while(sequence[i]<sequence[size-1]){//从左往右找左右子树分开的位置处
i++;
}
numble=i;
for(;i<root;i++){//左子树都比sequence[root]的值小,如果右子树的值都比sequence[root]的值大,那么返回true,否则返回false
if(sequence[i]<sequence[root]){
return false;
}
}
if(numble!=0){//如果左子树不为空,则递归 下一步
left=VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,numble));
}
if((size-numble-1)!=0){//如果右子树不为空,则递归下一步
right=VerifySquenceOfBST(Arrays.copyOfRange(sequence,numble,size-1));
}
return left&&right;
}
}