剑指offer系列-T24_2二叉搜索树的后序遍历序列

       本人对java语言更熟悉,所以剑指offer代码都是通过Java实现,且涉及的核心代码全部通过牛客网的测试用例检查,感谢牛客网为我检验程序提供了极大帮助!main函数是为了在自己运行程序时,运行结果更直观化。


/**
 * @author xhl
 * 二叉搜索树的后序遍历序列
 * 题目描述
 * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,
 * 否则输出No。假设输入的数组的任意两个数字都互不相同。
 * 思路:递归实现。最后元素是根节点,左边起直到出现大于根的数之前,为左子树,继续判断
 * 如果直到根节点前都是大于根的数,则可继续递归判断左右子树,否则,若在到达根节点前
 * 又出现小数,则不是遍历结果,返回false。
 * 
 */
public class offerT24_2 {

	/**
	 * @param args
	 */
	public boolean VerifySquenceOfBST(int[] sequence) {
		return VerifySquenceOfBST(sequence, 0, sequence.length - 1);

	}

	public boolean VerifySquenceOfBST(int[] sequence, int start, int end) {
		if (sequence.length == 0) {
			return false;
		}
		if (sequence.length == 1) {
			return true;
		}

		/* 此处是关键,当只有2个元素,1个元素,无元素时返回true */
		if (end - start == 1 || end - start == 0 || end - start == -1)
			return true;

		int PSentinel = end;
		int Sentinel = sequence[end];// 哨兵,即根节点

		/* 寻找左子树 */
		int i = start;
		while (i < PSentinel && sequence[i] < Sentinel) {
			i++;
		}// 若无左子树元素,则依然i=start

		/* 从左子树结束处继续寻找右子树 */
		int j = i;
		while (j < PSentinel && sequence[j] > Sentinel) {
			j++;
		}
		/* 还未到哨兵前一个,就在右子树中出现比根节点小的数,导致跳出寻找 */
		if (j < PSentinel)// 正确时跳出来应该是PSentinel
			return false;

		/* 继续判断左右子树是否是搜索树 */
		return VerifySquenceOfBST(sequence, start, i - 1)
				&& VerifySquenceOfBST(sequence, j, end - 1);

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		offerT24_2 o = new offerT24_2();
		int[] a = { 7, 4, 6, 5 };
		System.out.println(o.VerifySquenceOfBST(a));
	}

}


本文的目标读者是准备从事银行核心系统开发、维护的从业人员。请注意,是“准备”,换句话说,可以理解为一份对科技人员,尤其是对新入门的科技人员业务知识方面的培训手册,旨在让诸位从业务方面迅速上手(从技术角度上手的手册我已经贴过一份了,所以如果是用400的同行,可以结合本手册双合璧,效力倍增)。这里的着重点将会主要在于简单的银行会计原理,以及银行整体的业务流程,还有相应的模块实现手法和注意事项,对金融的会计知识方面应该可能会比较粗浅,这一点与金融系统常见的业务培训手册有所不同,注意体会。 基于此,本文将会假设读者具备一定的计算机技术,具备少量银行方面的业务知识,所以如果有从事非IT部门的读者(比如财务信贷的同事们),就请不要太计较里面的表述。当然如果有错误,还是非常欢迎出的。 对于已具备了若干开发、维护知识,或者是即将采用国外系统来建设的同行们而言,本文的内容可能就过于浅显了,看得不爽不要怪我没有事先提醒。 考虑到某方面的问题,这里的系统简介将尽可能的脱离某个具体的系统,仅就银行业务核心系统的共性,进行介绍以及探讨。 最后再说一下,没有什么手册、心得是万能的,个人的LEVEL UP始终是要靠自己的领悟,这里只是希望能让诸位新人不用象很多人当年一样,独自摸索与徘徊。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值