数据结构——链式二叉树(C语言版)

news2024/11/25 17:05:08

链式二叉树的结构

⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。 通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。
                                
由上图可见,链式二叉树的每个节点存有三个变量,第一个为节点存的数据,第二个与第三个分别为指向左孩子指针与指向右孩子指针。

创建链式二叉树

        由于普通的二叉树并没有插入删除的意义,所以在创建二叉树时只需要手动创建二叉树就行,因为普通二叉树没有条件限制比如:

所以在普通二叉树里并没有增删的意义,创建时只需要手动创建即可。

        创建二叉树的第一步:先写一个创建单个节点的函数,并将节点里左右指针都初始化为NULL,这样也方便后续链接操作。 第二步:手动申请7个节点,并将将节点之间进行链接。最终形成以下的逻辑图片。

        因为根结点的左⼦树和右⼦树分别⼜是由⼦树结点、⼦树结点的左⼦树、⼦树结点的右⼦树组成的,因此⼆叉树定义是递归式的,

链式二叉树的遍历

        前序遍历:

前序遍历(Preorder Traversal 亦称先序遍历):访问根结点的操作发⽣在遍历其左右⼦树之前,及访问顺序为:根,左子树,右子树。就以上图为例子
                        
第一步:先判断此时的根是否为NULL,如果是就输出NULL后返回,第二步:先输出根节点的值,接着在递归根的左子树,第三步:将根的左子树递归完后接着递归右子树。
                                                  左子树展开图
        以上是根节点的左子树的展开图:一开始会先节点是否为空,接着输出根节点数值,接着递根的左子树,当左子树为空的时候就开始递根的右子树,右子树又开始递 根,左子树,右子树,当左右子树都为NULL时候开始归。
当左子树归完后根节点开始递根节点的右子树。
                                                  右子树展开图
最终递归的输出顺序为:

        中序遍历:

        中序遍历(Inorder Traversal):访问根结点的操作发⽣在遍历其左右⼦树之中(间)及访问顺序为:左子树,根,右子树。
                                        
                                                  左子树展开图
        根据顺序,从根开始并没有先输出值而是先开始递归根的左子树,从上图的左子树的递归展开图中,当节点递到3的左子树(NULL)时,先输出NULL接着开始归,重新归到3节点时输出3,接着递归3的右子树(7),并重复步骤,当1的左子树递归完后就输出1节点的值并执行递归1的右子树。
                                                  右子树展开图
        
        当递归1的右子树(4)时,4又作为根开始递归4的左子树与右子树,但遇到NULL节点时就开始进行返回。
        最终中序遍历完成会输出:

        后序遍历:

        后序遍历(Postorder Traversal):访问根结点的操作发⽣在遍历其左右⼦树之后 ,及访问顺序为:左子树,右子树,根。
        
                                                        左子树展开图
                
                                                  右子树展开图
        从后续展开图中可以看出,二叉树的后序遍历,是优先访问根节点的左子树与右子树,将根节点的左右子树访问完最后再访问根节点的值,最终输出的顺序为:
        二叉树的前中后序其实访问的顺序是一样的,只是在于访问根节点数据的时机不同,产生的结果也不同。

        层序遍历:

除了二叉树的先序遍历、中序遍历、后序遍历外,还可以对⼆叉树进⾏层序遍历。设⼆叉树的根结点所在层数为1,层序遍历就是从所在⼆叉树的根结点出发,⾸先访问第⼀层的树根结点,然后从左到右访问第2 上的结点,接着是第三层的结点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程就是层序遍历。
        从上图可以看出,通过队列的特性,先进先出,先将根节点入队,入队后出队,并在出队的时候同时将根的左右子树入队,当节点为NULL则不入队,当队列重新为空时,则结束循环,并打印出二叉树的层序遍历形式。

链式二叉树的简单算法题

        求二叉树所有节点个数:

                                                左子树展开图

                                        右子树展开图

从上图的左右子树展开图图可以看出,求节点根数需要分别递归计算根的左子树与右子树,当递归到NULL时返回0,当左右子树递归完后需要再加上1(自身),再进行返回。最终计算出该子树节点数量为7。

        求二叉树叶子节点的个数:

                                        递归展开图

        因为叶子节点的特点是左右子树都为NULL,利用这一特性,当递到根的左右子树都为NULL,就返回1表示这个节点是叶子节点。如果左节点或又节点其中一个是NULL并不会返回1,而是继续递归。当递归到叶子节点时直接返回一。最终得得出根的左子树节点数与根的右子树节点数。

        求二叉树第k层的节点个数:

                                               

                                                        递归展开图

        由上图的展开图可以看出,假设k==3,分别递归根的左子树与右子树的第k层,每一次递归的时候都让k-1,当k==1的时候就说明已经到了第k层直接返回1,当递归到第k-1层的时,只需要判断k-1层的左节点与右节点,如果为NULL就返回0,最后将k层返回的数字进行相加并return就得到第k层节点数。

        求二叉树的深度:

                                        左子树深度展开图

                                右子树深度展开图        

        想要计算二叉树的深度,就要计算根的左子树与右子树的深度,将左子树的深度与右子树的深度进行比较,并返回较大值,如上图,通过递归展开,会得知左子树的深度为3,右子树的深度为2,最终返回左子树的深度+1,所以上图二叉树的深度为4。

        二叉树查找值为x的节点:

                                递归展开图

        由上图可见,当需要找x节点时,一开始会先判断根节点是否符合条件,如果符合条件直接返回,如果不符合就先递归根的左子树,当左子树递归完后发现并没有找到值会返回NULL,此时指针为NULL,会递归根的右子树,当发现有节点符合值的时候会直接返回并给指针赋值,防止继续递归。

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

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

相关文章

详细介绍BIO、NIO、IO多路复用(select、poll、epoll)

BIO、NIO、IO多路复用 BIO(Blocking IO)NIO(Non-blocking IO) 同步非阻塞IOIO多路复用selectpollepoll Redis的IO多路复用 BIO(Blocking IO) 最基础的IO模型,当进行IO操作时,线程会被阻塞,直到操作完成。 比如read和write,通常IO…

string indices must be integers

string indices must be integers 目录 string indices must be integers 【常见模块错误】 【解决方案】 常见原因及解决方法 具体案例分析 总结 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出…

python基础---2.流程控制及函数

🎈个人主页:靓仔很忙i 💻B 站主页:👉B站👈 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:python 🤝希望本文对您有所裨益,如有不足之处&…

Godot入门 07 世界构建2.0

添加基础节点Node,重命名为Coins,整理场景树,拖动Coin到Coins节点下。 添加基础节点Node,重命名为Platforms,整理场景树,拖动Platform到Platforms节点下。 添加游戏背景 设置当前图层名称为Mid 添加图层元…

sql基础查询

1.基础查询语法 distinct去重 例子: 尽量不写* 影响效率

智慧校园行政办公:优化车辆保险费用管理的新选择

在智慧校园的行政办公系统中,车辆保险费用管理功能扮演着不可或缺的角色,它专注于校园内公务用车的保险费用的系统化与自动化管理,旨在提升财务管理的透明度,减少人为失误,优化保险支出。这一功能的核心在于信息的准确…

Javascript面试基础6【每日更新10】

Gulp gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成 Gulp的核心概念:流 流,简单来说就是建立在面向对象基础上的一种抽象的…

【前端 14】Vue常见指令

Vue常见指令 Vue.js 是一个构建用户界面的渐进式框架,它通过一系列简洁的指令(Directives)来增强HTML的功能,使得开发者能够更加方便地构建出响应式的Web应用。本文将详细讲解Vue中的几个核心指令:v-bind、v-model、v…

[算法题]爱丽丝的人偶(一)

题目链接: 爱丽丝的人偶&#xff08;一&#xff09; 定义两个变量, 分别初始化为 1 和 n, 让两个变量不断向中间聚拢, 并同时按先输出最小值再输出最大值的规律输出, 如图: 这样就满足题意排好了, 题解代码: #include <iostream> using namespace std;int main() {int …

PlantUML学习笔记-嵌入式系统设计常用图例

在嵌入式系统设计过程中&#xff0c;需要使用一些图例对系统框架及业务流程进行说明&#xff0c;以便于多人协同开发及后期的系统维护&#xff0c;提高团队开发效率。 1. 嵌入式设计开发常使用的图例&#xff1a; 1.1 用例图&#xff08;Use Case Diagram&#xff09; 用例图…

美国GE工业大项目中断,一天内市值蒸发近290亿人民币,波及西门子等同行……...

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 本周二&#xff0c;美国东海岸发生了一起令人瞠目结舌的事件。GE Vernova公司参与的Vineyard Wind海上风电项目的一片巨型涡轮机叶片竟然断裂坠海…

《JavaEE》----2.<多线程的简介创建Thread类>

前言&#xff1a; 大家好&#xff0c;我目前在学习java。我准备利用这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论&#xff01;&#xff01;&#xff01; 喜欢我文…

Python装饰器:让函数更强大

在Python编程中&#xff0c;装饰器是一个强大的工具&#xff0c;它允许程序员以一种简洁优雅的方式修改或增强函数的行为&#xff0c;而无需更改其源代码。本文将介绍装饰器的基本概念、工作原理以及一些实际应用案例。 什么是装饰器&#xff1f; 装饰器本质上是一个接受函数…

Python酷库之旅-第三方库Pandas(049)

目录 一、用法精讲 176、pandas.Series.rank方法 176-1、语法 176-2、参数 176-3、功能 176-4、返回值 176-5、说明 176-6、用法 176-6-1、数据准备 176-6-2、代码示例 176-6-3、结果输出 177、pandas.Series.sem方法 177-1、语法 177-2、参数 177-3、功能 177…

【C语言】数组名的不同情况

前言 在C语言中&#xff0c;数组名的行为在不同的上下文中有细微的区别。数组名本质上是一个指向数组第一个元素的指针&#xff0c;但在某些情况下&#xff0c;它的行为会有所不同。以下是一些关键点&#xff0c;帮助你理解数组名在什么情况下代表第一个元素&#xff0c;什么情…

前端江湖:从菜鸟到大侠的修炼手册

在这个数字编织的梦幻世界里&#xff0c;前端&#xff0c;这个听起来就带着几分仙气与神秘感的词汇&#xff0c;实则是每一位互联网探险家手中的魔法杖。它不仅连接着代码的冰冷逻辑与用户的炽热情感&#xff0c;更在无数次的点击与滑动间&#xff0c;绘制出一幅幅绚丽多彩的交…

智慧港口整体解决方案

1. 智慧港口概况与建设意义 智慧港口建设对创新驱动和转型发展具有重要推动作用&#xff0c;是港口发展的主要方向。它通过物联网、移动互联网、云计算、人工智能等高新技术与港口功能的融合&#xff0c;提升港口的智能化和信息化水平&#xff0c;对国家可持续发展具有重要意义…

一键将桌面资料存到d盘的工具,小巧、绿色、免费、免安装

为了提升我们的系统稳定性以及资料的安全性&#xff0c;建议大家将电脑桌面的资料默认路径设置为D盘或其他磁盘&#xff0c;这样不仅会减少系统盘的占用空间&#xff0c;在系统盘出现故障时我们还可以通过pe工具备份桌面的资料。虽然我们也可以通过一些操作来修改桌面文件以及我…

视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程

Qinmei 3.0主题主要是将 wordpress 改造成纯 api 的站点&#xff0c;以便实现前后端分离的技术栈&#xff0c;目前的进度已经大致完成&#xff0c;唯一的问题就是需要安装 JWT token 插件。 功能介绍&#xff1a; 支持豆瓣以及 bangumi 的一键获取信息, 豆瓣 api 目前使用的是…

科普文:分布式架构中的三高:高并发、高性能、高可用

关于高并发 高并发场景 互联网应用以及云计算的普及&#xff0c;使得架构设计和软件技术的关注点从如何实现复杂的业务逻 辑&#xff0c;转变为如何满足大量用户的高并发访问请求。 一个简单的计算处理过程&#xff0c;如果一旦面对大量的用户访问&#xff0c;整个技术挑战就…