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

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

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

 

示例 1:

输入: 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     }
复制代码

 

posted @   跳动的休止符  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示