题目:重建二叉树

考点:树

题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

法一:递归法1,比较简洁易懂

 import java.util.*;
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length == 0 || in.length == 0){
return null;
}
//前序:{1,2,4,7,3,5,6,8} 中序:{4,7,2,1,5,3,8,6}
TreeNode node = new TreeNode(pre[0]);
for(int i = 0; i < in.length; i++){
if(pre[0] == in[i]){
//注意边界问题
//如i=3时,in[i]==pre[0],则中序{4,7,2,1,5,3,8,6}分为左边{4,7,2}和右边{5,3,8,6}。所以left的前序数组只需拷贝从[1,i+1)即可。
node.left = this.reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
node.right = this.reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
}
}
return node;
}
}

Arrays提供了一个copyOfRange方法进行数组复制。
Arrays.copyOfRange()的格式如下:

 copyOfRange(int[] original, int from, int to)
  1. 第一个参数表示源数组

  2. 第二个参数表示开始位置(取得到)

  3. 第三个参数表示结束位置(取不到)

法二:递归法2

 import java.util.*;
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode node = reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
return node;
}
//重载
private TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn){
//判断数组是否为空
if(startPre > endPre || startIn > endIn){
return null;
}
TreeNode node = new TreeNode(pre[startPre]);
for(int i = startIn; i <= endIn; i++){
if(pre[startPre] == in[i]){
//注意边界
node.left = reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
node.right = reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
break;
} }
return node;
}
}

最新文章

  1. ADO.NET一小记-select top 参数问题
  2. PHP获取IP地址
  3. HighchartsJS创建环形带标识的图表实例
  4. css导航栏
  5. Visual studio 2013安装及单元测试
  6. 戏说PHP的嵌套函数
  7. 《C++ Qt 设计模式》8|15拼图 小游戏的简单实现。拜托,别乱点!
  8. Android 上使用 iconfont 的一种便捷方案
  9. Asp.Net Mvc MapRoute .html不起作用(转)
  10. route-over VS mesh-under
  11. 【Time系列三】简单的计时器(秒表)
  12. jquery中,使用append增加元素时,该元素的绑定监听事件失效
  13. 翻煎饼 Stacks of Flapjacks
  14. shell脚本比较字符串相等
  15. 17_8_9 Spring 注入
  16. react-router简明学习
  17. PHP优化与提升
  18. optimize PHP-FPM优化
  19. eclipse签名使用的key文件(android生成keystore)
  20. debug $mysqli-&gt;character_set_name();

热门文章

  1. 20165213 Exp5 MSF基础应用
  2. AX_DataSource
  3. 20155312 张竞予 Exp 8 Web基础
  4. 常用API String
  5. centos7 启动tomcat卡盾
  6. selenium3+python3.6爬页面源码的代码
  7. (转)RandomAccessFile类使用详解
  8. 基于接口的 InvocationHandler 动态代理(换种写法)
  9. Android Studio将引用第三方jar包的library打包成jar包
  10. mongdb的索引及备份