剑指offer【04】- 重建二叉树(java)
2024-10-12 07:37:59
题目:重建二叉树
考点:树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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)
第一个参数表示源数组
第二个参数表示开始位置(取得到)
第三个参数表示结束位置(取不到)
法二:递归法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;
}
}
最新文章
- ADO.NET一小记-select top 参数问题
- PHP获取IP地址
- HighchartsJS创建环形带标识的图表实例
- css导航栏
- Visual studio 2013安装及单元测试
- 戏说PHP的嵌套函数
- 《C++ Qt 设计模式》8|15拼图 小游戏的简单实现。拜托,别乱点!
- Android 上使用 iconfont 的一种便捷方案
- Asp.Net Mvc MapRoute .html不起作用(转)
- route-over VS mesh-under
- 【Time系列三】简单的计时器(秒表)
- jquery中,使用append增加元素时,该元素的绑定监听事件失效
- 翻煎饼 Stacks of Flapjacks
- shell脚本比较字符串相等
- 17_8_9 Spring 注入
- react-router简明学习
- PHP优化与提升
- optimize PHP-FPM优化
- eclipse签名使用的key文件(android生成keystore)
- debug $mysqli->;character_set_name();