输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
(ps:我们约定空树不是二叉搜索树)
示例1
输入

[4,8,6,12,16,14,10]
返回值

true

思路分析:
二叉搜索树的特点是:如果当前节点有左子树,那么左子树的每一个节点的值都小于等于当前节点的值;如果当前节点有右子树,那么右子树的每一个点的值大于当前节点的值;
再来分析:树的后序遍历特点是什么,遍历顺序肯定是先左子树,后右子树,最后是根节点。
根据这两个特点我们可以知道,在传入的后续遍历序列里面,最后一个值是根节点,除了根节点,序列分为两部分:

以第一个大于根节点的值为分界线。第一个大于根节点的值之后的序列是根节点的右子树;
通过这些右子树的值来判断:

  • 每一个都大于根节点,
    如果大于表示当前节点满足平衡二叉树的特点。接下来我们分别对左子树和右子树做这样的处理。
  • 有一个不满足
    那就不是满足条件的后续遍历

重复两个操作,一直到没有节点可以被遍历。

代码展示:


/*
*输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
* 如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
* (ps:我们约定空树不是二叉搜素树)
* */
public class Solution {
    
    

    public boolean VerifySquenceOfBST(int [] sequence) {
    
    
        //二叉搜索树的特点,每个根节点都满足:节点的左子树都小于等于节点的值;节点的右子树都大于根节点的值
        //int index=sequence.length-1;
        if(sequence.length == 0){
    
    
            return false;
        }
        return traverse(sequence,0,sequence.length-1);

    }
    public boolean traverse(int[] sequence,int start,int end){
    
    
        if(start>=end){
    
    
            return true;
        }
        int key=sequence[end];
        int i=0;
        for( i=start;i<end;i++){
    
    
            if(sequence[i]>key)
                break;
        }
        for(int j=i;j<end;j++){
    
    
            if(sequence[j]<key){
    
    
                return false;
            }
        }
        return traverse(sequence,start,i-1)&&traverse(sequence,i,end-1);//在子树中遍历,除去根节点
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43815275/article/details/114888933