leetcode 106. 从中序与后序遍历序列构造二叉树 c语言递归解法
如题:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:3/ \9 20/ \15 7
这道题明显是有套路的,如果你还不会,说明你是第一次遇到,还好现在遇到,省的笔试的时候现场尴尬。可以根据中序遍历和后序遍历得到的序列递归求解子树。首先,我们知道,后序遍历得到的序列从后往前依次是原二叉树的根节点,根节点右子树的根节点.....,右子树的左子树的根节点。如果不理解的话, 没关系,待会看幅图就理解了。其次呢,我们可以知道,中序遍历中,根节点的位置是在中间的。这样,第一次,我们从后序遍历中找到根节点的值val,然后在中序遍历中找到val所属下标i,这时候得到val的左子树范围为【0, i-1】,右子树范围为【i+1, end】。紧接着,我们继续在相应的子树范围内找根节点,谁的根节点,分别是右子树的根节点和左子树的根节点,找到后,和val组合即可。看下图:
从图中的后序遍历从后往前观察,20是根节点,18是20右子树的根节点,7是18右子树的根节点。8是18的左子树根节点。像这样每次递归的查找根节点,然后组合即可。初始遍历的时候,中序遍历范围为0~InEnd,找到第一次后,划分为左子树范围【0, i-1】,右子树范围【i+1, end】。每次遍历从后序遍历数列中取根节点前,先判断其实范围start是否大于end,如果是的话,说明已经到底了,这时候递归即可返回。这一点结合代码可以看出:
struct TreeNode *findSubTree(int* inorder, int* postorder, int *postEnd, int inStart, int inEnd)
{int val, i;struct TreeNode *root, *left, *right;//首先判断是否溢出了,溢出则返回。if (inStart > inEnd)return NULL;//取出子树根节点val = postorder[*postEnd];//指针指向下一个子树的根节点*postEnd = *postEnd - 1;//中序遍历查找根节点所在位置for (i = 0; i <= inEnd; i++)if (inorder[i] == val)break;//在划分后的范围内继续查找root的右子树和左子树,顺序不能搞错right = findSubTree(inorder, postorder, postEnd, i + 1, inEnd);left = findSubTree(inorder, postorder, postEnd, inStart, i - 1);//组合子树root = (struct TreeNode *)calloc(1, sizeof(struct TreeNode));root->val = val;root->left = left;root->right = right;return root;
}struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize){//第一个根节点位置int postEnd = postorderSize - 1;//第一次查找,中序范围为0~inorderSize - 1。return findSubTree(inorder, postorder, &postEnd, 0, inorderSize - 1);
}
参考资料:
1. 106. 从中序与后序遍历序列构造二叉树_哔哩哔哩 (゜-゜)つロ 干杯~-
https://www.bilibili.com/video/av45393236
=============================================================================================
Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。
leetcode 106. 从中序与后序遍历序列构造二叉树 c语言递归解法相关推荐
- leetcode 105. 从前序与中序遍历序列构造二叉树 c语言递归解法
如题: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素.例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3 ...
- 二叉树的先序、中序、后序、层序遍历方式详解,由遍历序列构造二叉树过程详解以及C++代码详细实现
二叉树的遍历 树与二叉树的定义.性质,二叉树的顺序存储结构.链式存储结构 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.由于二叉树是一种非线性结构,每个结 ...
- [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]
[问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...
- 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...
- Suzy找到实习了吗Day 18 | 二叉树进行中:513 找树左下角的值,112 路径总和 ,106.从中序与后序遍历序列构造二叉树
513 找树左下角的值 solution # Definition for a binary tree node. # class TreeNode: # def __init__(self, val ...
- 【必拿下系列】106. 从中序与后序遍历序列构造二叉树105从前序与中序遍历序列构造二叉树
两题各自的链接放这里了: 链接: 106 链接: 105 106.从中序与后序遍历序列构造二叉树 如果你是不知道理论的,那就得仔细分析了, 举个例子: 输入:inorder = [9,3,15,20, ...
- 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)
引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...
- [leetcode]从中序与后序/前序遍历序列构造二叉树
从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 po ...
- java用中根后根序列构造二叉树,106. 从中序与后序遍历序列构造二叉树
题目描述 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例: 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder ...
最新文章
- 给研发工程师的代码质量利器 | SOFAChannel#5 直播整理
- 如何使对话框中接收到WM_CHAR消息(Windows编程)
- 数据库监听。数据库一次notify,Activity多次接收
- Vue——整合与中文化Moment.js解决方案
- python执行js文件
- SAP Spartacus ComponentData的提前subscription
- Leetcode--523. 连续的子数组和
- 微型计算机实验四答案,微型计算机技术实验指导书的答案.doc
- 涂抹果酱_如何玩果酱
- 数据库笔记07:实施数据完整性
- HDU 2689 POJ 2299 树状数组 + 离散化
- 智慧城市要让市民有获得感
- Aiseesoft Data Recovery从硬盘驱动器恢复丢失的数据的方法
- swagger配置及注解详解
- cyj sql 收藏
- python刷题记录:买帽子
- 第十六周助教工作总结——NWNU李泓毅
- Navicat Premium 12.1.24
- 静态创意和动态创意_2020年创意工作的5个预测
- 苹果 iOS/iPadOS 14.4 beta 2新功能
热门文章
- SQL Server技术问题之视图优缺点
- 触发器deleted 表和 inserted 表详解(转)
- Spring学习笔记-注入实战篇
- 解释与构造---无理数能级
- 用反向传导模拟共振并用共振频率作分类
- 游戏开发需要具备哪些技术_生鲜小程序需要具备哪些功能板块?生鲜小程序开发...
- 组态王中时间存access怎么存,组态王通过Access数据库起始截止日期查询方法
- 【Paper】2019_Bearing-only circumnavigation control of the multi-agent system around a moving target
- 1.7 理解 Dropout-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- TCL with SNPS llengthlappendget_cellsget_ports