判断给定的整数数组是不是某二叉搜索树的后序遍历的结果

该博客介绍了如何判断给定的整数数组是否符合二叉搜索树的后序遍历特性。二叉搜索树的特点是左子树所有节点小于根节点,右子树所有节点大于根节点。后序遍历的顺序是左子树->右子树->根节点。通过分析数组,可以递归地检查每个部分是否满足这一规则,从而确定数组是否为某二叉搜索树的后序遍历结果。
摘要由CSDN通过智能技术生成

二叉搜索树:

又:二叉查找树(Binary Search Tree),二叉排序树;

它或者是一棵空树,或者是具有下列性质的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。

数大于根肯定往根的右子树走,小于往左子树走

 

后序遍历:

左子->右子->根

想法(参考https://blog.csdn.net/xidiancoder/article/details/60956436

给出的整数数组:a[n]

method(a[n])

  1. 为空,返回false;只有一个元素,返回true;
  2. root=a[n-1];
  3. 从0~n-2找出第一个a[i]>root(没找到,则都为左子树)
    1. 若i<n-1,有右子树;i>0,有左子树
    2. 0~i-1是左子树,method(a[i-1])
    3. 如果a[i]~a[n-2]都大于root,则i~n-2是右子树,method(a[n-1-1]),否则返回false(不符合之前的“大于root都在右子树”的定义)
    4. return 3.2&3.3
public class Solution {
public static boolean VerifySquenceOfBST(int [] sequence) {
    int index;
    boolean Rflag=false;
    boolean Lflag=false;
    
    int n=sequence.length;
    if(n==0)
        return false;
    if(n==1)
        return true;

    int root=sequence[n-1];

    index=FindIndex(sequence,root);
        
    for(int i=index+1;i<n-1;i++) {
        if(sequence[i]<root)
        return false;
        }
        
    if(index<n-1) {
        int lenR=n-1-index;
        int[] arrR=new int[lenR];
        for(int i=index,j=0;i<n-1;j++,i++) {
        	arrR[j]=sequence[i];
        }
        Rflag=VerifySquenceOfBST(arrR);
    }
    else
        Rflag=true;
    if(index>0) {
        int lenL=index;
        int[] arrL=new int[lenL];
        for(int i=0;i<index;i++) {
        	arrL[i]=sequence[i];
        }
        Lflag=VerifySquenceOfBST(arrL);
    }
    else
        Lflag=true;
    
    return Lflag&&Rflag;
}
    public static int FindIndex(int[] arr,int val) {
    	int n=arr.length;
    	
        for(int i=0;i<n-1;i++) {
            if(arr[i]>val)
            return i;
        }
        return n-2;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值