判断一个数组序列为二叉树的后序遍历序列

来源:互联网 发布:只有我知 杭州见面会 编辑:程序博客网 时间:2024/05/16 16:10

思路:

1.、 二叉树中,满足左子节点<父节点<右子树节点,后序遍历中,先遍历左子树,再遍历右子树,最后遍历根节点。

2、二叉树一条重要的性质就是它满足中序遍历的结果。所以左子树中的节点最大也要小于等于根节点,右子树中的节点要大于等于根节点。

3、对于后序遍历而言,数组序列中最后一个元素为其根节点,然后前面的数中,从最开始到第一个大于根节点的数都是左子树中的数,而后面到倒数第二个数应该都是大于根节点的,是右子树,如果后面的数中有小于根节点的,那么说明这个序列不是二叉搜索树的后序遍历序列。

4、采用分治算法的思想,即将问题分为两部分,然后再将每一部分分成两部分,递归调用自身,即程序中有两次调用自身。

5、 这里用到一个Arrays工具类的一个方法,public static int[] copyOfRange(int[] original,int from, int to),将指定数组的指定范围复制到一个新数组。

参数:
original - 将要从其复制一个范围的数组
from - 要复制的范围的初始索引(包括)
to - 要复制的范围的最后索引(不包括)。(此索引可以位于数组范围之外)。
返回:
包含取自原数组指定范围的新数组,截取或用 0 填充以获得所需长度

package JianZhiOffer;


import java.util.Arrays;

public class VerifySquenceOfBST
{
    public boolean VerifySquenceOfBST(int[] sequence)
    {
        if(sequence==null||sequence.length <=0)
            return false;
        int len=sequence.length ;
        int root=sequence[len-1];
        int i=0;
        for(i=0;i<len-1;i++)
        {
            if(sequence[i]>=root)
                break;
        }
        int j=i;
        for(;j<len-1;j++)
        {
            if(sequence[j]<root)
                return false;    
        }
        boolean left=true;
        if(i>0)
        {
            left=VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i));         //分治算法思想,递归调用处理左子树序列
        }
        boolean right=true;
        if(i<len-1)
        {
            right=VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,len-1));             //分治算法思想,递归调用处理右子树序列
        }
        return left&&right;
        
    }
  }

阅读全文
0 0