zoukankan      html  css  js  c++  java
  • 《剑指offer》面试题6 重建二叉树 Java版

    (由一个二叉树的前序和中序序列重建一颗二叉树)

    书中方法:我们要重建一棵二叉树,就要不断地找到根节点和根节点的左子结点和右子节点。注意前序序列, 它的第一个元素就是二叉树的根节点,后面的元素分为它的左子树的前序遍历和右子树的前序遍历。现在的问题是如果光靠前序序列,我们只能找到根节点,但是我们不知道两个子序列的长度,也就无法继续用同样的方法找到子树的根节点。这时候我们就需要一个辅助序列——中序序列,根据它的特性,根节点一定在左子序列和右子序列的中间,这样我们就可以确定两个子序列的长度了。

    	public TreeNode build(int[] a, int[] b){
    		if(a.length == 0){
    			return null;
    		}
    		return build(a, 0, a.length-1, b, 0, b.length-1);
    	}
    	
    	private TreeNode build(int[] a, int aStart, int aEnd, int[] b, int bStart, int bEnd){
    		if(aStart > aEnd)return null;
    		//构建根节点
    		TreeNode root = new TreeNode(a[aStart]);
    		//找到根节点在中序序列中的位置
    		int partition = bStart;
    		for(int i=bStart; i<=bEnd; i++){
    			if(b[i] == a[aStart]){
    				partition = i;
    				break;
    			}
    		}
    		//在左子序列中继续构建根节点
    		root.left = build(a, aStart+1, aStart+1+partition-1-bStart,
    				b, bStart, partition-1);
    		//在右子序列中继续构建根节点
    		root.right = build(a, aStart+partition-bStart+1, aEnd,
    				b, partition+1, bEnd);
    		//返回构建好的根节点
    		return root;
    		
    	}
    

    注:只能用前序+中序或者后序+中序重建二叉树,用前序+后序重建的二叉树不唯一,因为我们不能确定前序序列第一个元素的后面以及后序序列最后一个元素的前面表示的到底是左子树还是右子树。例如一个只有左子树的二叉树3<-2<-1和一个只有右子树的二叉树1->2->3,他们的前序和中序序列是一样的。

  • 相关阅读:
    update语句更新多条记录, 标记下
    点击超链接从VSTF、SVN及文件共享服务器上下载文件
    批量插入数据, 将DataTable里的数据批量写入数据库的方法
    SqlServer规范, 标记下
    学习笔记Mysql操作总结
    今拾到了个联合查询, 琢磨了好几个小时, 标记一下
    【读书笔记】 拜读潘加宇的《软件方法》一书的摘抄(上)
    关于引用类型的 ref 传参操作
    sed 正则表达式处理日志
    各省市个税计算器
  • 原文地址:https://www.cnblogs.com/czjk/p/11589869.html
Copyright © 2011-2022 走看看