目录

1. 重建二叉树

1.1 题目描述

1.2 复习基础知识

1.3  思路分析

1.4 总结


1. 重建二叉树

原题链接:

剑指 Offer 07. 重建二叉树 - 力扣(LeetCode)https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/submissions/

1.1 题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历结果中不含有重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}要求你重建如下图所示的二叉树并返回它的根结点。

如图所示:根结点为1。

1.2 复习基础知识

前序遍历就是在遍历二叉树时先访问根结点再访问左子树,最后访问右子树。

中序遍历就是在遍历二叉树时先访问左子树,再访问根结点,最后访问右子树。

后序遍历就是在遍历二叉树时先访问左子树,再访问右子树,最后访问根结点。
下面以一颗满二叉树为例,简单复习一下前中后序的遍历 :

同理可得到中序遍历结果: 4   2   5   1   6   3   7。

后序遍历结果:4   5   2   6   7   3   1。

//前序遍历
void PrevOrder(BTNode* root)
{//递归结束条件if (root == NULL){return;}printf("%c ", root->data);//左子树PrevOrder(root->left);//右子树PrevOrder(root->right);
}//中序遍历
void InOrder(BTNode* root)
{//递归结束条件if (root == NULL){return;}//左子树InOrder(root->left);printf("%c ", root->data);//右子树InOrder(root->right);
}//后序遍历
void PostOrder(BTNode* root)
{//递归结束条件if (root == NULL){return;}//左子树PostOrder(root->left);//右子树PostOrder(root->right);printf("%c ", root->data);
}

1.3  思路分析

有了上面的基础知识,就能够解决这道题目啦!

还是以这组例子分析哈:

输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}。

如下图所示,前序遍历的第一个数字1就是根结点的值。扫描中序遍历的序列就能确定根结点值的位置。根据中序遍历的特点,在根结点的值1前面的3个数字都是左子树节点的值,位于1后面的数字都是右子树的值。

由于在中序遍历中,有3个数字是左子树节点的值,因此左子树共有3个左子节点。同样,在前序遍历序列中,根结点后面的3个数字就是3个左子树节点的值,再后面的所有数字都是右子树节点的值。这样我们就在前序遍历和中序遍历两个序列中分别找到了左,右子树对应的子序列。

现在我们搞清楚了如何在前序遍历和中序遍历序列中找到根结点左子树,右子树!完成这一步我们就构建出了一个根结点,我们可以用同样的方法分别构建左,右子树。也就是说,接下来的事情就可以交给递归去做!!

如何递归呢?

我们把前序遍历的左子树拿出来,当成一个新的前序遍历序列,把中序遍历的左子树拿出来当成一个新的中序遍历序列,再去找到新的前序遍历序列和新的中序遍历中的根结点,左子树,右子树。以此类推,右子树同理。

右子树同理哈!!!!!

//递归重建二叉树,因为两个序列的大小是一样的,所以传一个size即可
struct TreeNode* recurison(int* arr1, int* arr2, int size)
{//开辟空间,构建节点struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));//记录前序遍历序列中下标为0的值,即根结点的值int val = arr1[0];//赋值,创建结点root->val = val;//遍历中序序列找到根结点的下标int i=0;for(i=0; i < size;i++){if(val == arr2[i]){break;}}if(i != 0) //如果下标在中序序列中不为0,取左子树出来,递归构建左子树{root->left = recurison(arr1 + 1, arr2, i);}else //如果下标在中序序列中为0,左子树不存在,令root->left = NULL{root->left = NULL;}if(i != size -1) //如果下标在中序序列中不为size - 1,取右子树出来,递归构建右子树{root->right = recurison(arr1 + 1 + i, arr2 + i + 1, size - i - 1);}else //如果下标在中序序列中为size - 1,右子树不存在,令root->right = NULL{root->right = NULL;}//返回当前层的根结点,连接双亲节点return root;
}struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){if(preorderSize==0 || inorderSize==0) //处理输入为空的情况{return NULL;}return recurison(preorder, inorder, inorderSize);
}

1.4 总结

我们把构建二叉树的大问题分解成构建左,右子树的两个小问题。我们发现小问题和大问题在本质上是一致的,因此可以用递归解决。学好二叉树不怕弄不懂递归!!!

加油!!!!

剑指offer----C语言版----第五天相关推荐

  1. 剑指offer(第二版)读书笔记以及编程题目python版答案(二)

    剑指offer(第二版)读书笔记以及编程题目python版答案(二) 题目五:青蛙跳台阶 github地址: https://github.com/ciecus/leetcode_answers/tr ...

  2. 【剑指offer】Java版代码(完整版)

    参考链接 [剑指offer]Java版代码(完整版)

  3. 剑指offer第2版Python题解(更新中)

    O(n^2)排序 冒泡排序.插入排序与选择排序(Python)_NLP_victor的博客-CSDN博客 归并 归并排序(Python)_NLP_victor的博客-CSDN博客 快排 快速排序(Py ...

  4. 剑指Offer(第二版)面试题56:数组中数字出现的次数

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/73609133冷血之心的博客) 剑指Offer(第二版)面试题56: ...

  5. 剑指offer有用python版的吗_Python算法面试通关,剑指offer就靠它了

    原标题:Python算法面试通关,剑指offer就靠它了 北上广容不下肉身, 三四线放不下灵魂, 程序员里没有穷人, 有一种土豪叫算法工程师. 算法,晦涩难懂,却又是IT领域最受重视的素养之一可以说, ...

  6. 剑指offer有python版吗_剑指Offer算法类题目[Python版]

    标签:重复   作用   coding   面试   medium   mba   none   fas   utf-8 面试题012 数值的整数次方 解题思路1 考虑所有情况,循环连乘 代码: de ...

  7. 剑指Offer(JS版)

    字符串的排列 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. ...

  8. LeetCode刷题 _「剑指 Offer]专项突破版

    第01天 整数 剑指 Offer II 001. 整数除法 class Solution:# 时间复杂度:O(logn), 空间复杂度:O(1)def divideCore(self, dividen ...

  9. 剑指offer C语言实现

    剑指offer的C语言实现,已经提交到github了, 需要的可以去看看 https://github.com/lintingbin2009/C-language/tree/master/%E5%89 ...

  10. 剑指offer:java版

    作者:CyC2018 链接:https 文章目录 一.基础 3.数组中的重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到头打印链表 7. 重建二叉树 8. 二叉树的下一个结点 9. 用 ...

最新文章

  1. 判断32位整数二进制中1的个数
  2. 干货:B端产品经理,快速成长的密码
  3. shell实现https登录
  4. Linux学习总结(16)——CentOS 下 Nginx + Tomcat 配置负载均衡
  5. 最新log4j2 远程代码执行漏洞(紧急扩散)
  6. java判断safari_js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本
  7. Java中字符串的几个实例
  8. 计算机操作系统笔记(四)
  9. 考Java二级要不要背方法英文_考英语二级有什么技巧吗?
  10. OSChina 周二乱弹 ——有一天你当了程序员巴巴
  11. Ubuntu下安装配置gitLab(一)
  12. OpenCV-计算平均值cv::mean
  13. Displaytag 使用简介
  14. 数据结构课设任务内容
  15. python读取grd数据_Matlab 读取.grd文件
  16. win10你的电脑遇到问题,需要重新启动,我们只收集某些错误信息(volmgr win10 161) ---(解决方法:调整内存对应的页面文件)
  17. 亿康先达2018年取得两位数全球增长
  18. RabbitMq实战——外卖派单通过补单系统实现分布式事务
  19. CCNP基础知识-路由(二)
  20. DDA(数值微分法)绘制直线(C++,VS2019)

热门文章

  1. 洛谷 P2559 [AHOI2002]哈利·波特与魔法石
  2. 十分钟,让你学会Vue的这些巧妙冷技巧
  3. c语言中流,C语言中流控制语句.doc
  4. 利用 redis 实现延迟消息队列
  5. 用 Python3 OpenCV 将视频转成字符动画
  6. 制作ASCII字符动画
  7. 初学APM 行用性能管理/监控
  8. 屏幕录像专家7.5注册机 1
  9. Attention,Multi-head Attention--注意力,多头注意力详解
  10. 【ONE·C++ || C++11(一)】