二叉树的后序遍历序列:

2018-05-31  本文已影响0人  夏臻Rock

题目描述:

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

分析:

后序遍历:左->右->根

二叉搜索树定义:一个二叉树,它的每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大。(即小的在左,大的在右)

根据后序遍历的顺序,我们可以知道数组的最后一个节点一定是二叉树的根节点,那么前面的序列,一部分是左子树(都比根节点小),另一部分是右子树(都比根节点大)。此后,可以递归地进行判断,左子树序列中的最后一个元素是左子树跟节点,比它小的是其左子树,比它大的是其右子树。·····以此类推,如果存在在左子树序列中出现比根节点大的,或者右子树序列中比根节点小的情况,那么就说明不是二叉搜索树的后序遍历序列。

代码:

public class Solution {
    public boolean VerifySquenceOfBST(int[] sequence) {
        if (sequence == null || sequence.length == 0) return false;
        if (sequence.length == 1) return true;
        return judge(sequence,0,sequence.length-1);
    }

    public static boolean judge(int[] sequence, int start, int end) {
        //当起始位置大于终止位置的时候,说明这颗子树为空,直接返回true即可。
        if(start>end) return true;
        int root = sequence[end];
        //找到左子树序列的起始位置,起点是start,终点是首个大于根节点元素的前面一个元素
        int lefts = start;
        for(;lefts<end-1;lefts++){
            if(sequence[lefts]>root) break;
        }
        //右子树序列,即从首个大于根节点的元素到根节点的前一个元素,判断这个序列中是否每个元素都大于根节点
        int rights  = lefts;
        for(;rights<end-1;rights++){
            if(sequence[rights]<root) return false;
        }
        //递归调用,判断是否左子树和右子树的结构满足二叉搜索树的结构
        boolean isleft = judge(sequence,start,lefts-1);
        boolean isright = judge(sequence,rights,end-1);
        return isleft && isright;
    }
}
运行通过

小结:

对于这种输入是一个int[] 数组的函数,我们进行二分递归操作的时候,需要记录它的起始位置和终止位置,这样才能进行递归。

上一篇 下一篇

猜你喜欢

热点阅读