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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通