剑指offer之二叉搜索树的后序遍历序列

数据结构中的数也是一个重难点. 本题考察二叉搜索树, 首先看二叉搜索树的定义 : 二叉搜索树(Binary Search Tree), 指的是一颗空树或者具有下列性质的二叉树 :

  1. 若任意节点的左子树不为空, 则左子树上所有的节点的值均小于它的根节点的值;
  2. 若任意节点的右子树不为空, 则右子树上所有的节点的值均大于它的根节点的值;
  3. 任意节点的左、右子树也分别为二叉查找树;
  4. 没有键值相等的节点

从上面的定义可以看到, 二叉搜索树的定义也是递归的, 那么就可以考虑从递归的方式解决这个问题.

递归思路

后序遍历序列的最后一个节点一定是根节点, 那么就可以通过根节点和左右子树节点的大小关系来将整个序列分为左子树的序列和右子树的序列, 然后再用递归的方法分别进行判断 :

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0)
            return false;
        if(sequence.length == 1)
            return true;
        return judge(sequence, 0 , sequence.length - 1);
    }
    private boolean judge(int []se, int start, int root){
        if(start >= root)
            return true;
        int i = root;
        while(i > start && se[i - 1] > se[root])
            i--;
        for(int j = start; j < i; j++){
            if(se[j] > se[root])
                return false;
        }
        return judge(se, start, i-1)&&judge(se, i,root-1);
    }
}

非递归思路

对一个二叉搜索树来说, 根节点的左子树每个节点的值肯定小于右子树每个节点的值, 所以可以不断地去掉序列的最后一个值, 并且把剩下的部分分为小于最后一个值和大于最后一个值的部分, 只要能分出来就符合二叉树的定义.

每次最后一个值都是右子树的根比左子树的所有值要大, 这样将右子树判断完了, 到了左子树也是将左子树看成一颗具有左右子树的二叉搜索树.

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0)
            return false;
        if(sequence.length == 1)
            return true;
        int start = 0; 
        int end = sequence.length - 1;
        while(end > 0) {
            while(sequence[start] < sequence[end]){
                start ++;
            }
            while(sequence[start] > sequence[end]){
                start ++;
            }
            if( start < end)
                return false;
            end--;
            start = 0;
        }
        return true;
    }
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值