剑指offer----C语言版----第五天

news2024/9/25 1:18:27

目录

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 总结

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

加油!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

极简四则运算解释器

前言: 这是最近完成的一个小的 demo&#xff0c;一个极简四则运算解释器。前面&#xff0c;已经基于这个想法发了两篇博客了&#xff1a; 四则运算和二叉树 简单四则运算语法树可视化 然后&#xff0c;前两天也就完成了这个总体的 demo 程序。本来整个程序的思路大致上有了&…

前端框架 Nuxt3 集成axios 配置跨域

目录 一、安装axios 二、Nuxt3项目集成axios 1、项目根目录下创建server/api目录 2、调用封装的单例axios对象 3、页面中调用请求函数 刚开始通过Nuxt3使用axios时&#xff0c;以为axios还需要配置跨域&#xff0c;但经过多次测试发现&#xff0c;在Nuxt3框架里并不需要配…

磨金石教育摄影技能干货分享|胡杨为什么被新疆人奉为精神图腾

痴迷于胡杨的摄影家 新疆摄影师王汉冰&#xff0c;昨天我们介绍了他一张《沙狐之眼.》&#xff0c;天人合一的画面让我们感到震撼。 除此之外王汉冰还有一个称号那就是“胡杨王”。 意思很明确&#xff0c;那就是擅长拍摄胡杨&#xff0c;作品也多是以胡杨见长。 新疆地大物博&…

【OpenCV 例程 300篇】253. 多帧图像(动图)的读取与保存

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】253. 多帧图像&#xff08;动图&#xff09;的读取与保存 1. 多帧图像&#xff08;动图&#xff09; 多帧图像是将多幅图像或帧数据保存在单个文件中&#xff0c;也称为多页图像或图像序列&#xf…

eNSP 实现静态路由中的路由备份

eNSP 实现静态路由中的路由备份 eNSP 实现静态路由中的路由备份&#xff1b;路由备份功能&#xff0c;可以提高网络的可靠性。用户可以根据实际情况&#xff0c;配置到同一目的地的多条路由&#xff0c;其中一条路由的优先级最高&#xff0c;作为主路由&#xff0c;其余的路由…

06 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题

前言 问题是这样的 之前 同事碰到了这样的一个问题, 说是基于 ftp 客户端更新文件名字 更新失败 然后 看了一下, 原来是 调用了 retrieveFileStream, 然后 没有同步等待 数据传输完成, 然后 之后直接调用了 rename 的方法 然后 发现 rename 返回的是 false, 并且 文件名…

看我今年奋斗,观我未来之路

看我今年奋斗&#xff0c;观我未来之路 。 博客之星评选已经进行了几天。我也没有很去关注这东西&#xff0c;毕竟一个刚注册一年、写了无数水文的误导他人的博主&#xff0c;怎么可能拿到博客之星&#xff1f; 我&#xff0c;只是无聊时转发一下&#xff0c;那句毫无新意、从…

大学生如何在网上赚零花钱,适合学生党可做的零花钱项目

大学生的课余时间是非常多的&#xff0c;利用这些时间&#xff0c;我们可以去做点小兼职赚点零花钱&#xff0c;既可以补贴生活费&#xff0c;又可以获得不一样的生活体验。 现在大学生完全可以不用去大街上发传单&#xff0c;或者去咖啡店当服务员了&#xff0c;自己在网上就…

【数据结构】单链表(线性表)的实现

目录 一、什么是链表 二、单链表的实现 1、动态申请一个结点 2、单链表打印 3、单链表尾插 4、单链表的尾删 5、单链表的头插 6、单链表头删 7、单链表查找 8、单链表在pos位置之后插入x 9、单链表删除pos位置之后的值 10、单链表在pos位置之前插入x 11、单链表删除pos位置的值…

前端期末考试试题及参考答案(04)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 在页面中&#xff0c; ______标签用于创建一个表单。< form>中的______属性用于指定接收并处理表单数据的服务器url地址。< form>中的______表示以…

基于springboot+Vue的疫情防控系统(程序+数据库)

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

Linux 资源限制 setrlimit

有的时候为了避免程序毫无意义的占用CPU&#xff08;如死循环&#xff09;、过度占用内存&#xff08;如内存泄漏&#xff09;&#xff0c;我们可以限制程序使用的资源。 下面主要从两个角度限制资源&#xff1a; 限制程序累计运行时长限制可以使用的内存大小 限制资源使用到…

微信小程序 | 小程序系统API调用

&#x1f5a5;️ 微信小程序专栏&#xff1a;小程序系统API调用 &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ &#x1f44…

Go语言进阶

一、并发 VS 并行 1: 多线程程序在一个核的CPU上运行 2: 多线程程序在多个核的CPU上运行 Go可以充分发挥多核优势&#xff0c;高效运行。 线程&#xff1a;用户态&#xff0c;轻量级线程&#xff0c;栈MB级别。 协程&#xff1a;内核态&#xff0c;线程内跑多个协程&#xff…

最短路径的java代码实现

1.最短路径定义及性质 有了加权有向图之后&#xff0c;我们立刻就能联想到实际生活中的使用场景&#xff0c;例如在一副地图中&#xff0c;找到顶点a与地点b之间的路径&#xff0c;这条路径可以是距离最短&#xff0c;也可以是时间最短&#xff0c;也可以是费用最小等&#xff…

爬虫的奇技淫巧之ajax-hook

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 前言 随着反爬力度的不断升级&#xff0c;现在的爬虫越来越难搞了。诸如加密参数sign、signature、token。面对这种情况传统的方式可以使用自动…

Redis集群系列九 —— 集群伸缩之扩容

集群伸缩 Redis 集群提供了灵活的节点扩容和收缩方案&#xff0c;当有新节点加入时&#xff0c;需要把一部分数据迁移到新节点来达到集群的负载均衡&#xff1b;当旧节点退出时&#xff0c;需要把其上的数据迁移到其他节点上&#xff0c;确保该节点上的数据能够被正常访问。从…

ext4 extent详解3之内核源码流程讲解

本文在前两篇《ext4 extent详解1之示意图演示》和《ext4 extent详解2之内核源码详解》讲解ext4 extent 文章的基础上&#xff0c;本文从内核源码、实例演示等角度详细介绍ext4 extent B树的形成过程&#xff0c;希望看过本文的读者能理解ext4 extent B树的工作原理。 1 &#…

6.3 返回类型和return语句

文章目录无返回值函数有返回值函数值是如何被返回的不要返回局部对象的引用或指针引用返回左值列表初始化返回值主函数main的返回值递归返回数组指针声明一个返回数组指针的函数使用尾置返回类型使用decltypereturn语句终止当前正在执行的函数并将控制权返回到调用该函数的地方…

2022年终总结:点滴积累让我不再迷茫

今年是开始写作的第二年&#xff0c;如果说第一年是起步的话&#xff0c;今年就是开始有了一些小收获了&#xff0c;通过点滴积累让我知道积累的充实感&#xff0c;通过一点一点粉丝或阅读量的积累&#xff0c;增加写作的自信。 今年的收获 首先看一下今年的阅读量和粉丝量: …