当前位置:网站首页>Leetcode 105. 从前序与中序遍历序列构造二叉树
Leetcode 105. 从前序与中序遍历序列构造二叉树
2022-08-08 10:09:00 【LuZhouShiLi】
Leetcode 105. 从前序与中序遍历序列构造二叉树
题目
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
思路
- 首先数组大小为0,说明是空结点
- 如果不为空,那么去前序数组的最后一个元素作为节点元素
- 找到前序数组最后一个元素在中序数组的位置,作为切割点
- 舍弃前序数组的第一个元素
- 切割中序数组,切成中序左数组和中序右数组
- 由于中序左数组和中序右数组的数组长度都是和先序左数组和先序右数组的长度相同
- 切割先序数组,先序左数组和先序右数组
- 递归处理左区间和右区间
代码
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */
class Solution {
public:
TreeNode* traversal(vector<int>& inorder,vector<int>& preorder){
// 数组大小为0 说明是空结点
if(preorder.size() == 0)
{
return NULL;
}
// 取出后序数组的第一个元素 作为节点元素
int rootValue = preorder[0];
TreeNode* root = new TreeNode(rootValue);
// 叶子节点
if(preorder.size() == 1) return root;
// 第三步 寻找切割点
int d;
for(d = 0; d < inorder.size(); d++)
{
if(inorder[d] == rootValue)
{
break;
}
}
// 切割中序数组 得到中序左数组和中序右数组
vector<int> leftInorder(inorder.begin(),inorder.begin() + d);
vector<int> rightInorder(inorder.begin() + d + 1,inorder.end());
// 丢弃前序数组的第一个元素
vector<int>::iterator k = preorder.begin();
preorder.erase(k);
// 切割前序数组
vector<int> leftPreorder(preorder.begin(),preorder.begin() + leftInorder.size());
vector<int> rightPreorder(preorder.begin() + leftInorder.size() ,preorder.end());
root->left = traversal(leftInorder,leftPreorder);
root->right = traversal(rightInorder,rightPreorder);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(inorder.size() == 0|| preorder.size() == 0)
{
return NULL;
}
return traversal(inorder,preorder);
}
};
边栏推荐
猜你喜欢
随机推荐
Categorized input and output, Go lang1.18 introductory refining tutorial, from Bai Ding to Hongru, go lang basic data types and input and output EP03
文档数据库是用来干什么的呢?
Dubins curve study notes and related thinking
FreeSql 将 Saas 租户方案精简到极致[.NET ORM SAAS]
Solutions and ideas for the problem that Loadrunner's recording event is 0
使用.NET简单实现一个Redis的高性能克隆版(三)
go web之响应用户
Redis 定长队列的探索和实践
英文token预处理,用于将英文句子处理成单词
快速定位线上慢 SQL 问题,掌握这几个性能排查工具可助你一臂之力
文档数据库中的文档可以有相同的数据结构嘛?
Pinia(一)初体验快速安装与上手
xgboost 加速
MySQL源码解析之执行计划
功夫再高也怕菜刀,产品经理的那些事
文档数据库和列存储数据库有什么不同的嘛?
键值数据库中可以对值进行查询嘛?
什么是本质安全?
MySQL学习第一部分:认识MySQL
列存储数据库是通过什么来定位的呢?