如题:

根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。例如,给出
中序遍历 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语言递归解法相关推荐

  1. leetcode 105. 从前序与中序遍历序列构造二叉树 c语言递归解法

    如题: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素.例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3 ...

  2. 二叉树的先序、中序、后序、层序遍历方式详解,由遍历序列构造二叉树过程详解以及C++代码详细实现

    二叉树的遍历 树与二叉树的定义.性质,二叉树的顺序存储结构.链式存储结构 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.由于二叉树是一种非线性结构,每个结 ...

  3. [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...

  4. 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...

  5. Suzy找到实习了吗Day 18 | 二叉树进行中:513 找树左下角的值,112 路径总和 ,106.从中序与后序遍历序列构造二叉树

    513 找树左下角的值 solution # Definition for a binary tree node. # class TreeNode: # def __init__(self, val ...

  6. 【必拿下系列】106. 从中序与后序遍历序列构造二叉树105从前序与中序遍历序列构造二叉树

    两题各自的链接放这里了: 链接: 106 链接: 105 106.从中序与后序遍历序列构造二叉树 如果你是不知道理论的,那就得仔细分析了, 举个例子: 输入:inorder = [9,3,15,20, ...

  7. 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)

    引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...

  8. [leetcode]从中序与后序/前序遍历序列构造二叉树

    从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 po ...

  9. java用中根后根序列构造二叉树,106. 从中序与后序遍历序列构造二叉树

    题目描述 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例: 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder ...

最新文章

  1. 给研发工程师的代码质量利器 | SOFAChannel#5 直播整理
  2. 如何使对话框中接收到WM_CHAR消息(Windows编程)
  3. 数据库监听。数据库一次notify,Activity多次接收
  4. Vue——整合与中文化Moment.js解决方案
  5. python执行js文件
  6. SAP Spartacus ComponentData的提前subscription
  7. Leetcode--523. 连续的子数组和
  8. 微型计算机实验四答案,微型计算机技术实验指导书的答案.doc
  9. 涂抹果酱_如何玩果酱
  10. 数据库笔记07:实施数据完整性
  11. HDU 2689 POJ 2299 树状数组 + 离散化
  12. 智慧城市要让市民有获得感
  13. Aiseesoft Data Recovery从硬盘驱动器恢复丢失的数据的方法
  14. swagger配置及注解详解
  15. cyj sql 收藏
  16. python刷题记录:买帽子
  17. 第十六周助教工作总结——NWNU李泓毅
  18. Navicat Premium 12.1.24
  19. 静态创意和动态创意_2020年创意工作的5个预测
  20. 苹果 iOS/iPadOS 14.4 beta 2新功能

热门文章

  1. SQL Server技术问题之视图优缺点
  2. 触发器deleted 表和 inserted 表详解(转)
  3. Spring学习笔记-注入实战篇
  4. 解释与构造---无理数能级
  5. 用反向传导模拟共振并用共振频率作分类
  6. 游戏开发需要具备哪些技术_生鲜小程序需要具备哪些功能板块?生鲜小程序开发...
  7. 组态王中时间存access怎么存,组态王通过Access数据库起始截止日期查询方法
  8. 【Paper】2019_Bearing-only circumnavigation control of the multi-agent system around a moving target
  9. 1.7 理解 Dropout-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  10. TCL with SNPS llengthlappendget_cellsget_ports