C++——从前序与中序遍历序列构造二叉树leetcode105

C++------从前序与中序遍历序列构造二叉树leetcode105

题目描述

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

preorder 和 inorder 均 无重复 元素

inorder 均出现在 preorder

preorder 保证 为二叉树的前序遍历序列

inorder 保证 为二叉树的中序遍历序列

思路

来源于leetcode官方解答,先序遍历的排布是[根节点,左子树,右子树],中序遍历的排布是[左子树,根节点,右子树],因此,从先序第一个元素可以找到中序中的根节点的位置,从而可以确定出左子树和右子树的节点数目,从而可以正确划分这一级的先序遍历的左右子树,对于左右子树内部也是对应的排列方式,因此可以考虑迭代,每次更新先序遍历和中序遍历的左右边界。

同时为了减少每次查询中序根节点位置,可以考虑将值和索引使用哈希表存放。

代码

cpp 复制代码
unordered_map<int, int> hash_map;
TreeNode* mybuildTree(vector<int> preorder, vector<int> inorder, int preorder_l, int preorder_r, int inorder_l, int inorder_r)
{
	if(preorder_l>preorder_r) return nullptr;
	int pos = hash_map[preorder[preorder_l]]; // 根节点在中序中的位置
	TreeNode* root = new TreeNode(preorder[preorder_l]);
	int left_tree_length = pos-inorder_l;
	int right_tree_length = inorder_r-pos;
	root->left = mybuildTree(preorder, inorder, preorder_l+1, preorder_l+left_tree_length, inorder_l, pos-1);
	root->right = mybuildTree(preorder, inorder, preorder_r-right_tree_length+1, preorder_r, pos+1, inorder_r);
	return root;
}
TreeNode* buildTree(vector<int> preorder, vector<int> inorder)
{
	int n = preorder.size();
	for(int i = 0; i<n; i++)
	{
		hash_map[inorder[i]] = i; // 值:索引
	}
	return mybuildTree(preorder, inorder, 0, n-1, 0, n-1);
}
相关推荐
程序员大雄学编程6 分钟前
「用Python来学微积分」16. 导数问题举例
开发语言·python·数学·微积分
B站_计算机毕业设计之家26 分钟前
预测算法:股票数据分析预测系统 股票预测 股价预测 Arima预测算法(时间序列预测算法) Flask 框架 大数据(源码)✅
python·算法·机器学习·数据分析·flask·股票·预测
Dreams_l41 分钟前
redis中的数据类型
java·开发语言
梵得儿SHI42 分钟前
Java IO 流详解:字符流(Reader/Writer)与字符编码那些事
java·开发语言·字符编码·工作原理·字符流·处理文本
太过平凡的小蚂蚁1 小时前
Kotlin 协程中常见的异步返回与控制方式(速览)
开发语言·前端·kotlin
007php0071 小时前
京东面试题解析:同步方法、线程池、Spring、Dubbo、消息队列、Redis等
开发语言·后端·百度·面试·职场和发展·架构·1024程序员节
想唱rap1 小时前
C++ list 类的使用
c语言·开发语言·数据结构·c++·笔记·算法·list
景彡先生1 小时前
Python函数定义与调用全解析:从基础语法到实战技巧
linux·开发语言·python
l1t1 小时前
利用DuckDB SQL求解集合数学题
数据库·sql·算法·集合·duckdb
yuyanjingtao2 小时前
CCF-GESP 等级考试 2024年9月认证C++四级真题解析
c++·算法·青少年编程·gesp·csp-j/s