判断给出的序列是否为二叉搜索树的后序遍历结果

问题

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

分析

  (1)后序遍历的最后一个元素一定是头结点,根据头结点对序列进行划分。

  (2)划分后的子序列依然遵循(1)的规则。所以继续划分。

  (3)子序列只包含1或2个节点,返回true。

  (4)当划分的子序列中存在非法元素,此次判断为false。非法元素的意思是划分后左子序列应该都大于头结点,其中<头结点的元素即为非法元素。

code

public boolean VerifySquenceOfBST(int [] sequence) {
        
        //结束条件判断
        if(sequence==null || sequence.length==0) {
            return false;
        }else if(sequence.length==2 || sequence.length==1) {
            return true;
        }else {
            System.out.println(sequence.length);
            int val = sequence[sequence.length-1];
            int index=0;
            //找到分割点
            boolean flag=false;  //如果子集不合法,返回false
            for(int i=0;i<sequence.length;i++) {
                if(!flag &&sequence[i]>val) {
                    index = i;
                    flag=true;
                }
                if(flag && sequence[i]<val) {
                    return false;
                }
                
            }
            if(index==sequence.length || index==0) {
                return VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, sequence.length-1));
            }else{
                return (VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, index)) &&
                        VerifySquenceOfBST(Arrays.copyOfRange(sequence, index, sequence.length-1)));
                
            }
        }
        
    }
原文地址:https://www.cnblogs.com/dream-flying/p/12895294.html