• [原]《程序员面试题精选》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 查看评论
  • 相关阅读:
    对于工程师责任和责任边界的认知
    windows消息机制与实例
    final阶段团队贡献分分配
    Final阶段用户调查报告
    对金州勇士团队的项目进行功能分解(加分作业)
    final review 报告
    final发布评论
    本周PSP
    final发布视频
    【转】mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案
  • 原文地址:https://www.cnblogs.com/huanglei/p/3677703.html
Copyright © 2020-2023  润新知