每天一道算法题——二叉搜索树的后序遍历序列

前言:
由于过去几个月参与毕业实习的原因,暂时顾不上写博客,今天开始重拾旧事吧。

题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
测试用例:
[4,8,6,12,16,14,10]
[1,2,3,4,5]
对应输出应该为:
true
true
分析:

左子树一定比右子树小,因此去掉后,数字分队列尾部的root之后数字分为前后两段,左子树(前一段)小于root,而右子树(后半段)大于root才对,因此我们可以每次只看有子树是否符合条件即可。
对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小可以暂时把他看出右子树的左子树
所以只需看看右子树的右子树是否符合要求即可
使用递归的方法思路更加清晰,但是若是将递归转换为循环的话,效率能高一些,而且不会浪费内存。

源码:
递归:

import java.util.ArrayList;
import java.util.Stack;

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

        private boolean judge(int[] sequence, int i, int j) {
            if (i==j) {
                return true;
            }
            int m = i;
            while(sequence[m++]<sequence[j]&&m<j);

            int temp = m;
            while(sequence[temp++]>sequence[j]&&temp<j);
            if (temp<j) {
                return false;
            }
            if (m==j||m==i) {
                return judge(sequence, i, j-1);
            }else {
                return judge(sequence, i, m-1)&&judge(sequence, m, j-1);
            }
            return false;
        }
    }
}

循环:

import java.util.ArrayList;
import java.util.Stack;

public class Test1 {
    public class Solution {
        public boolean VerifySquenceOfBST(int [] sequence) {
            int size = sequence.length;
            if (size==0) {
                return false;
            }
            int i = 0;
            while(--size!=0){
                while(sequence[i++]<sequence[size]);
                while(i<size&&sequence[i++]>sequence[size]);

                if (i<size) {
                    return false;
                }
                i = 0;
            }
            return true;
        }
    }
}

运行测试:

递归测试:运行时间:19ms 占用内存:9544k
循环测试:运行时间:16ms 占用内存:8592k

总结:
此题重点考验了对二分查找树(Binary Search Tree)的结构理解。只要晓得了BST的后序序列规则,使用递归的思想很容易就能得到一个解,但是递归效率要低于循环,所以可以想办法将递归转化为循环即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值