从前序与中序遍历序列构造二叉树(递归)
给定两个整数数组 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]
/** * 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: map<int,int> index; TreeNode* myBuildTree(vector<int>& preorder, vector<int>& inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right){ if(preorder_right-preorder_left<0) return nullptr;//先序序列已遍历完毕 //构造当前节点 TreeNode* node = new TreeNode(preorder[preorder_left]); //确定当前节点在中序序列中的位置 int inorder_node = index[node->val]; //确定当前节点的左子树的节点数 int leftsize = inorder_node - inorder_left; //递归构造该节点的左右子树 node->left= myBuildTree(preorder,inorder,preorder_left+1,preorder_left+leftsize,inorder_left,inorder_node-1); node->right= myBuildTree(preorder,inorder,preorder_left+leftsize+1,preorder_right,inorder_node+1,inorder_right); return node; } TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { int n = preorder.size(); //对inoder序列构造从值到索引的映射,以便能根据值快速找到在inorder中的索引 for(int i=0;i<n;i++){ index[inorder[i]] =i; } //构造二叉树 return myBuildTree(preorder,inorder,0,n-1,0,n-1); } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix