[原]《程序员面试题精选》07.后序遍历结果判断其是否为二叉查找树

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

         8
       /  \
      6    10
    / \    / \
 5   7   9  11

因此返回true。

如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。


分析:首先我们要清楚二叉查找树后序遍历结果的特点:

1.数组最后一个元素为根节点 

2.除去根节点前面部分分别为左子树和右子树(即比根节点小的左子树和比根节点大的右子树)

也就是说违背了上面两特点的都不是二叉查找树的后续遍历,具有判断性的特点只有第2个特点,(左子树都比根节点小,右子树都比根节点大)。

5、7、6、9、11、108            

红色部分为左子树,蓝色为右子树,黑色为根节点

代码编写具体思路:

1.找到第一个大于根节点的数,即9,所以9之后的为右子树

2.如果右子树的值都大于根节点8,则符合

3.递归法分别判断是否左子树和右子树都符合这种特点。

import java.util.* ;
public class SearchTree{

	public static boolean searchTree(int a[],int length){
		boolean flag = true ;
		if(length<=0||a==null){
			return false;
		}
		int root = a[length-1] ;
		int i = 0 ;
		
		while(a[i]<root){
			i++ ;                 //得到左子树和右子树的分界线,a[i]为右子树第一个
		}
		int j=i ;
		
		for(;j<length-1;++j){
			if(a[j]<root){
				flag = false ;
			}
		}
		if(i>0){
			searchTree(a,i) ;
		}
		if(i<length-1){
			searchTree(Arrays.copyOfRange(a,i,length-1),length-i-1) ;
		}
		
		return flag ;
	}

	public static void main(String args[]){
		int a[] = {5,7,6,9,11,10,8} ;    //true
		//int a[] = {7, 4, 6, 5} ;     false
		System.out.println(searchTree(a,a.length)) ;
	}
}


参考资料:

作者:SpeedMe 发表于2014-4-3 21:53:55 原文链接
阅读:186 评论:0 查看评论
原文地址:https://www.cnblogs.com/huanglei/p/3677703.html