leetcode105 从前序与中序遍历序列中构造二叉树
时间:2021-09-03
本文章向大家介绍leetcode105 从前序与中序遍历序列中构造二叉树,主要包括leetcode105 从前序与中序遍历序列中构造二叉树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1]
Output: [-1]
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder 和 inorder 均无重复元素
inorder 均出现在 preorder
preorder 保证为二叉树的前序遍历序列
inorder 保证为二叉树的中序遍历序列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题目主要明白先序遍历中确定根,因为递归的每一层中的先序遍历的第一个值总是根
而中序遍历是为了确定左子树中节点的个数和右子树中节点的个数
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length==0)
return null;
HashMap<Integer,Integer> map=new HashMap<>();//建立hashmap的作用是方便查找根节点在中序遍历中的索引,这样根索引-中序左边界得到左子树中节点的个数,中序右边界-根索引得到右子树中节点的个数。
for(int i=0;i<inorder.length;i++)
{
map.put(inorder[i],i);
}
return RecurBuid(map,0,preorder.length-1,preorder,0,inorder.length-1);
}
public TreeNode RecurBuid(HashMap<Integer,Integer> map,int preOderLeft,int preOderRight,int[] preorder,int inOderLeft,int inOrderRight)
{
if(preOderLeft>preOderRight)
return null;
int preOderRootIndex=preOderLeft;
int inOrderRootIndex=map.get(preorder[preOderRootIndex]);
TreeNode root=new TreeNode(preorder[preOderRootIndex]);
int leftCount=inOrderRootIndex-inOderLeft;//确定左子树中节点的个数,为什么不是右子树??因为先序遍历中根节点后面首先根的左子树
root.left=RecurBuid(map,preOderRootIndex+1,preOderLeft+leftCount,preorder,inOderLeft,inOrderRootIndex-1);
root.right=RecurBuid(map,preOderLeft+leftCount+1,preOderRight,preorder,inOrderRootIndex+1,inOrderRight);
return root;
}
原文地址:https://www.cnblogs.com/AI-Creator/p/15222103.html
- Python时间获取及转换
- spark streaming知识总结[优化]
- 让你真正明白spark streaming
- Centos7 firewalld防火墙基本操作
- Spark Sql系统入门4:spark应用程序中使用spark sql
- Flume+Kafka收集Docker容器内分布式日志应用实践
- CentOS7搭建ELK日志集中分析平台
- Centos安装sshfs实现挂载目录
- shell脚本监控磁盘使用率
- Python使用MD5加密字符串
- Spark MLlib之 KMeans聚类算法详解
- Python时间与时间戳转换
- linux配置ssh互信实现免密登陆
- uva--1339 - Ancient Cipher(模拟水体系列)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux中rz上传、sz下载命令详解
- Linux alias命令编写
- 详解linux系统调用原理
- Linux下安装pyenv的方法
- 详解Linux如何生成随机数字和字符串
- linux(ubuntu)用户连续N次输入错误密码进行登陆时自动锁定X分钟
- linux下安装golang的方法
- Linux系统的文件传输方法
- CentOS 6.8 NFS 文件共享设置的方法
- linux如何mount挂载磁盘并设置开机自动mount的实现
- 浅谈Linux的编码及编码转换方法
- 在 Linux 上用 DNS 实现简单的负载均衡的方法
- centos7.2.1511安装jdk1.8.0_151及mysql5.6.38的方法
- Linux CentOS使用crontab设置定时重启的方法
- centos安装php5、卸载php、安装php7的教程