Leetcode [654] 最大二叉树 &[105] 从前序与中序遍历序列构造二叉树 & [106] 从中序与后序遍历序列构造二叉树
思路:
labuladong手把手带你刷二叉树(第二期)
按照题目给出的例子,输入的数组为[3,2,1,6,0,5]
,对于整棵树的根节点来说,其实在做这件事:
TreeNode constructMaximumBinaryTree([3,2,1,6,0,5]) { // 找到数组中的最大值 TreeNode root = new TreeNode(6); // 递归调用构造左右子树 root.left = constructMaximumBinaryTree([3,2,1]); root.right = constructMaximumBinaryTree([0,5]); return root; }
也就是找到数组中的最大值,创建root,然后分别递归左右部分
class Solution { public: TreeNode* constructMaximumBinaryTree(vector<int>& nums) { return build(nums,0,nums.size()-1); } TreeNode* build(vector<int>& nums, int lo,int hi) { if(lo>hi) return NULL; int index=lo; int max=nums[lo]; for(int i=lo;i<=hi;++i){ if(nums[i]>max){ index=i; max=nums[i]; } } TreeNode* root=new TreeNode(max); root->left=build(nums,lo,index-1); root->right=build(nums,index+1,hi); return root; } };
[105] 从前序与中序遍历序列构造二叉树

思路:
前序遍历保证了preorder[0]就是根节点,然后可以根据根节点在inorder中找到对应位置,以此来确定左子树的长度和右子树的长度,返回到preorder中划分开左右子树。
class Solution { public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { TreeNode* node=sol(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1); return node; } TreeNode* sol(vector<int>& preorder, int pl,int pr, vector<int>& inorder,int il,int ir) { if(pl>pr||il>ir) return NULL; int val=preorder[pl]; int index=0; for(int i=il;i<=ir;++i){ if(inorder[i]==val){ index=i; } } int left_len = index-il; int right_len = ir-index; TreeNode* root = new TreeNode(val); root->left=sol(preorder,pl+1,pl+left_len,inorder,il,index-1); root->right=sol(preorder,pl+left_len+1,pr,inorder,index+1,ir); return root; } };
[106] 从中序与后序遍历序列构造二叉树

思路:
同上,后序遍历保证最后一位是根节点,然后到中序遍历中找到左右子树长度
class Solution { public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { TreeNode* res=sol(inorder,0,inorder.size()-1, postorder,0,postorder.size()-1); return res; } TreeNode *sol(vector<int>& inorder, int il,int ir, vector<int>& postorder,int pl,int pr) { if(il>ir||pl>pr) return NULL; int root=postorder[pr]; int x=0; for(int i=il;i<=ir;++i) { if(root==inorder[i]) { x=i; break; } } TreeNode* node=new TreeNode(root); TreeNode* left=sol(inorder,il,x-1,postorder,pl,pl+(x-il)-1); TreeNode* right=sol(inorder,x+1,ir,postorder,pl+(x-il),pr-1); node->left=left; node->right=right; return node; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
分类:
leetcode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2017-06-07 Leetcode 142. 环形链表 II(中等)linked-list-cycle-ii——链表,找出开始循环节点
2017-06-07 Leetcode 41. 环形链表(简单)linked-list-cycle——链表、判断是否循环链表、快慢指针
2017-06-07 reorder-list——链表、快慢指针、逆转链表、链表合并
2017-06-07 c 链表之 快慢指针 查找循环节点(转)
2017-06-07 binary-tree-preorder-traversal——前序遍历
2017-06-07 binary-tree-postorder-traversal——二叉树后续遍历
2017-06-07 insertion-sort-list——链表、插入排序、链表插入