重建二叉树
2023-04-18 13:03:27 时间
题目描述
根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
解题思路
前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。然后分别对左右子树递归地求解。
public class ReConstructBinaryTree {
// 缓存中序遍历数组每个值对应的索引
private Map<Integer, Integer> indexForInOrders = new HashMap<>();
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
for (int i = 0; i < in.length; i++)
indexForInOrders.put(in[i], i);
return reConstructBinaryTree(pre, 0, pre.length - 1, 0);
}
/**
* @param pre 前序遍历顺序
* @param preL 按照前序遍历,子树的第一个节点索引
* @param preR 按照前序遍历,子树的最后一个节点索引
* @param inL 按照中序遍历,子树的第一个节点索引
* @return
*/
private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int inL) {
if (preL > preR)
return null;
//相对每个子树而言,每个前序遍历的节点都是跟节点
TreeNode root = new TreeNode(pre[preL]);
//找到中序遍历下这个根节点的索引位置
int inIndex = indexForInOrders.get(root.val);
//根据中序遍历的特点(左根右),根节点的左边就是左子树,左子树的节点个数如下
int leftTreeSize = inIndex - inL;
//左半边部分,根据前序遍历的特点(根左右),左子树的根就在当前根节点的下一个节点
root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, inL);
//右半边部分,根据前序遍历的特点(根左右),右子树的根就在当前根节点加左子树个数后的下一个节点
root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, inL + leftTreeSize + 1);
return root;
}
}
相关文章
- 搜狗地图上线手机AR实景高精导航:实时车距计算、碰撞预警
- 谁来保护人脸识别的安全?
- 支付宝历年双十一背后的技术揭秘
- 关于MVC/MVP/MVVM的一些错误认识
- Android 10 Go版将推出,针对内存不足1.5GB手机
- 全球首款碳纳米管通用计算芯片问世!Nature连发三文推荐
- 小米OV成立互传联盟,手机文件数据可跨品牌传输
- 谷歌设计团队发布了一款动效神器,让 UI 和动效无缝打通
- iOS开发一定要尝试的 Texture(ASDK)
- css权重的计算规则
- gson解析json数据的方法
- angularjs双向绑定原理是什么?
- fastjson格式化
- fastjson和jackson区别
- angularjs ng-options设置多个默认选项
- eclipse json格式化
- js switch语句计算指定日期是今年的第几天
- javascript substr截取字符串
- 引入RabbitMQ后,你如何保证全链路数据100%不丢失?
- MySQL 定时备份数据库(非常全),值得收藏!