105. 从前序与中序遍历序列构造二叉树

发布时间:2022-06-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了105. 从前序与中序遍历序列构造二叉树脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

105. 从前序与中序遍历序列构造二叉树

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

 

示例 1:

105. 从前序与中序遍历序列构造二叉树

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

 

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列
 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14 
15     unordered_map<int,int> hashMap; // key->节点值, value->中序遍历根节点位置
16     TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
17         int n = preorder.size();
18         for(int i = 0; i < n; i++)
19             hashMap[inorder[i]] = i; //记录中序遍历的根节点位置
20         return dfs(preorder,inorder,0,n-1,0,n-1);        
21     }
22     //pl,pr对应一棵子树的前序遍历区间的左右端点
23     //il,ir对应一棵子树的中序遍历区间的左右端点
24     TreeNode* dfs(vector<int>&pre,vector<int>&in,int pl,int pr,int il,int ir)
25     {
26         if(pl > pr || il > ir)  return NULL; //子树为空
27         int k = hashMap[pre[pl]] - il; // hashMap[pre[pl]]是中序遍历中根节点位置,k是子树前序和中序遍历的长度
28         TreeNode* root = new TreeNode(pre[pl]);
29         root->left = dfs(pre,in,pl+1,pl+k,il,il+k-1);  //左子树前序遍历,左子树中序遍历
30         root->right = dfs(pre,in,pl+k+1,pr,il+k+1,ir); //右子树前序遍历,右子树中序遍历
31         return root;
32     }

 

脚本宝典总结

以上是脚本宝典为你收集整理的105. 从前序与中序遍历序列构造二叉树全部内容,希望文章能够帮你解决105. 从前序与中序遍历序列构造二叉树所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: