判断整数序列是不是二叉查找树(BST)的后序遍历结果

转载:点击打开链接

这里沿用传统二叉查找树(BST)的概念:所有左子树都小于根,右子树都大于根。(不止是直接孩子,还有间接孩子!)

现在给出一个整数序列,要求判断它是否是一棵二叉查找树BST的后序遍历结果。

如果去掉BST这个条件,我们一般是不能只根据后序遍历结果来确定某一棵树的。

有了BST这个条件后,我们可以这么做:

定义如下递归函数头:

1int judge(int* arr,int start, intend)

(1)另root = end-1,则arr[root]为从start开始,end结束的子树的根(后序遍历么!)

(2)我们另i从start开始,一直++,直到碰到第一个arr[i]大于arr[root]的,那么此时的i已经位于右子树了。从start~i-1是左子树。

(3)显然从i~end-2是右子树,我们检查这段arr[j],如果有发现<arr[root]的,直接返回false。(右子树必须都大于根!)

(4)递归检查左子树 judge(arr, start, i-1) 和右子树 judge(arr, i, end-2)。如果某一个judge返回0,那么返回0,两个都1返回1。

(5)如果start==end时候,或者arr==NULL时(空树也是BST的一种!),可以直接返回1。

好了,代码如下:

package bst;

public class Main {

	/**
	 * 
	 * @param nums
	 * @param start
	 *            数组下标从0开始
	 * @param end
	 *            数组下标
	 * @return
	 */
	private static boolean judge(int[] nums, int start, int end) {

		// 空数组或者只有一个元素的数组也是二叉查找树,返回true
		if (nums == null || start == end) {
			return true;
		} else {
			int root = end; // 最后的元素肯定是bst的根
			int i = start;
			for (; i < root; i++) { // 后序遍历的前部分是左子树,都小于根
				if (nums[i] > nums[root]) {
					break;
				}
			}
			int j = i;
			for (; j < root; j++) { // 后续遍历的后部分是右子树,都大于根
				if (nums[j] < nums[root]) {
					return false;
				}
			}

			boolean left = true; // 递归判断左子树

			if (i > 0) {
				left = judge(nums, start, i - 1);
			}
			boolean right = true; // 递归判断右子树
			if (i < end) {
				right = judge(nums, i, end - 1);
			}
			return left && right;
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] nums = { 5, 7, 6, 9, 11, 10, 8 };
		boolean result = judge(nums, 0, nums.length - 1);
		System.out.println(result);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值