剑指Offer——题目23

/* 日期:2019.7.23
 * 作者:***
 * 功能:剑指offer 题目23
 * 
 * =============================================
 * 问题描述:
 * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
 * 如果是则输出Yes,否则输出No。
 * 假设输入的数组的任意两个数字都互不相同。
 * 
 * =============================================
 * 思路详解:
 * 首先明白什么是二叉搜索树:
 * 二叉查找树(Binary Search Tree),
 * (又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 
 * 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 
 * 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
 * 它的左、右子树也分别为二叉排序树。
 * 
 * 这个问题的思路也很简单:
 * 首先,找准问题的特征:后跟遍历的序列最后一个值为当前操作部分子树的根值
 * 明白了这个,问题其实就已经解决了:
 * 找到了根值之后,根据搜索二叉树的特征,问题就解决了
 * 遍历序列,正常正确的情况下,应该是,前半部分都比根小,后半部分都比根大!
 * 利用这个条件进行递归即可!
 * */

package com.***************;

import java.util.*;

public class Main3 {
	
	//主函数,作为程序测试代码的入口
	public static void main(String args[])
	{
		System.out.println("请输入进行测试的搜索二叉树的后跟遍历序列:");
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine();
		String str[] = string.split(" ");
		scanner.close();
		int [] sequence = new int[str.length];
		for(int i = 0; i < str.length; i++)
			sequence[i] = Integer.parseInt(str[i]);
		
		//客户端处理
		Main3 main3 = new Main3();
		boolean flag = main3.VerifySquenceOfBST(sequence);
		
		if(flag)
			System.out.println("YES");
		else {
			System.out.println("No");
		}
	}

	//封装函数,解决问题
	public boolean VerifySquenceOfBST(int [] sequence) {
		if(sequence == null || sequence.length == 0) return false;	//特殊情况处理
		return isOk(sequence, 0, sequence.length - 1);
    }
	
	//分离子问题
	public boolean isOk(int [] array,int left,int right)
	{
		if(left >= right) return true;	
		
		int i = left;
		for(i = left; i < right; i++)	//循环遍历,当前根的左右子树的分界点
			if(array[i] > array[right])
				break;
		
		if(i == right) return true;		//特殊情况处理,减少递归调用
		
		for(int j = i; j < right; j++)	//得到分界点后,保证了分界点之前的所有值全部小于root
			if(array[j] < array[right])	//还要保证分界点之后的所有值全部大于root
				return false;
		
		return isOk(array, left, i-1) && isOk(array, i, right-1);	//递归判断左右子树的情况
	}	
}

猜你喜欢

转载自blog.csdn.net/romantic_jie/article/details/97004947
今日推荐