树基本概念+前中后序遍历二叉树

🌈一、树的基本概念

☀️1.树的定义:树是一种非线性结构,看起来像一棵倒挂的树,根朝上,而叶朝下。

在这里插入图片描述

☀️2.相关术语

1.根节点:图中的A,无前驱结点
2.叶节点(终端节点):度为0的节点; 如上图:B、C、H、I…等节点为叶节点。
3.分支节点(非终端节点):度不为0的节点; 如上图:D、E、F、G…等节点为分支节点。
4.父节点(双亲节点):如上图:A是B的父节点。
5.子节点:如上图:B是A的孩子节点。
6.兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点。
7.节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6。
8.节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
9.树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6。
10.树的高度或深度:树中节点的最大层次; 如上图:树的高度为4。
11.森林:由m(m>0)棵互不相交的树的集合称为森林。

注:子树不可以相交,相交是图
在这里插入图片描述

☀️3.树的表示方法:

法一:有几个孩子就设定几个孩子指针:
在这里插入图片描述
缺陷:孩子数无法改变了。
法二:用顺序表存储孩子指针:
在这里插入图片描述
缺陷:define了N,孩子数无法改变了。
法三(最优方法):左孩子右兄弟:
父节点只需要一个指针指向最左侧的孩子,其他孩子都可以通过左孩子的指针依次找到。
在这里插入图片描述
优势:当有多个且数量不固定的孩子节点时用该结构也可以。
用该结构访问到每一个孩子:在这里插入图片描述
判断节点是否是叶子节点:看左孩子是否是空。
法四:双亲表示法,不支持通过父亲找孩子,只支持通过孩子找父亲。(并查集中会用)
在这里插入图片描述
如何检查一片森林中有几棵树:数有几个-1就有几棵树。
如何判断两个节点在不在同一棵树上:看两个节点的根一不一样。

🌈二、二叉树基本概念

☀️1.二叉树定义:

一棵二叉树是结点的一个有限集合,该集合或者为空,或者由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
在这里插入图片描述

☀️2.二叉树特性:

1.二叉树不存在度大于2的结点,对于任意的二叉树都是由以下几种情况复合而成的:
在这里插入图片描述

2.二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

☀️3.学习二叉树的意义:

二叉树的价值不是存储数据和增删查改,仅仅存储数据可以用链表等结构存储,没必要用复杂的二叉树来存储数据。二叉树价值在于根节点处存储的值(最小最大值),可以借此进行排序。

☀️4.特殊的二叉树:

1.满二叉树:一个二叉树,如果每一层的结点数都达到最大值,则这个二叉树就是满二叉树。

2.完全二叉树:有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树,即最后一层的节点从左到右排中间没有空隙。 满二叉树是一种特殊的完全二叉树。

3.单值二叉树

☀️5.关于节点数和序号数的性质及相关题目

🎈性质:

1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2i-1个结点。
2.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2h-1。
注:错位相减法算满二叉树节点个数:
在这里插入图片描述

3.对任何一棵二叉树, 如果度为0的叶结点个数为n0, 度为2的分支结点个数为n2,则有n0=n2+1。
4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度h=log2(n+1)。
在这里插入图片描述
5.高度为h的完全二叉树,节点数范围是:2(h-1)~2h-1。
6.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
①若i>0,i位置节点的父节点序号:(i-1)/2;i=0,i为根节点编号,无双亲节点。
②若2i+1<n,左孩子序号为2i+1;2i+1>=n时无左孩子。
③若2i+2<n,右孩子序号为2i+2;2i+2>=n时无右孩子。

🎈题目:

1.某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为(B)
A 不存在这样的二叉树
B 200
C 198
D 199
分析:有199个度为2的节点,可得知有199+1=200个度为0的节点。选B。

2.下列数据结构中,不适合采用顺序存储结构的是(A)
A 非完全二叉树
B 堆
C 队列
D 栈
选A。

3.在具有 2n 个结点的完全二叉树中,叶子结点个数为(A)
A n
B n+1
C n-1
D n/2
分析:
n0=n2+1,n1=0或1,代入下式得
2n=n0+n1+n2=2×n2+1+n1
n1此时只能等于1
2n=2×n2+2,n2=n-1,叶子结点n0=n-1+1=n,选A。

4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为(B)
A 11
B 10
C 8
D 12
分析:假设树层数为h,则完全二叉树节点数范围是2(h-1)~2h-1,29=512,210=1024,512<531<1023,因此该树高度h为10。选B。

5.一个具有767个节点的完全二叉树,其叶子节点个数为(B)
A 383
B 384
C 385
D 386
分析:假设度为0的节点数为n0,度为1的节点数为n1,度为2的节点数为n2,完全二叉树的n1只能是0或1,n0=n2+1,
则n0+n1+n2=2 ∗ * n2+n1+1=767,节点数不可能是小数,则n1为0,n2值为383,叶子节点数n0为384。选B。

☀️6.二叉树的存储结构

🎈(1)顺序存储

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
在这里插入图片描述

🎈(2)链式存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链。
在这里插入图片描述

在这里插入图片描述

🌈三、前中后序遍历二叉树

先手动构建图示的二叉树:
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
typedef struct BinaryTreeNode {struct BinaryTreeNode* left;struct BinaryTreeNode* right;int val;
}BTNode;BTNode* BuyNode(int x) {BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (!node) {perror("malloc fail");exit(-1);}node->val = x;node->left = NULL;node->right = NULL;return node;
}
int main() {BTNode* node1 = BuyNode(1);BTNode* node2 = BuyNode(2);BTNode* node3 = BuyNode(3);BTNode* node4 = BuyNode(4);BTNode* node5 = BuyNode(5);BTNode* node6 = BuyNode(6);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return 0;
}

☀️1.前序遍历二叉树

在这里插入图片描述
顺序:1->2->3->NULL->NULL->NULL->4->5->->NULL->NULL->6->NULL->NULL
代码:
主函数中调用PreOrder(node1),即:

PreOrder(node1);
void PreOrder(BTNode* root) {if (!root) {printf("NULL ");return;}printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}

结果:
在这里插入图片描述

☀️2.中序遍历二叉树

在这里插入图片描述
顺序:NULL->3->NULL->2->NULL->1->NULL->5->NULL->4->NULL->6->NULL
代码:
主函数中调用InOrder(node1),即:

InOrder(node1);
void InOrder(BTNode* root) {if (!root) {printf("NULL ");return;}InOrder(root->left);printf("%d ", root->val);InOrder(root->right);
}

打印结果:
在这里插入图片描述

☀️3.后序遍历二叉树

在这里插入图片描述
顺序:
NULL->NULL->3->NULL->2->NULL->NULL->5->NULL->NULL->6->4->1
代码:
主函数中调用PostOrder(node1),即:

PostOrder(node1);
void PostOrder(BTNode* root) {if (!root) {printf("NULL ");return;}PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);
}

打印结果:
在这里插入图片描述

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

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

相关文章

代码随想录 738. 单调递增的数字

题目 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9 示例 2: 输入: n 1234 输出: 1234 示例 3: 输…

第九节HarmonyOS 常用基础组件4-Button

一、Button Button组件主要用来响应点击操作&#xff0c;可以包含子组件。 示例代码&#xff1a; Entry Component struct Index {build() {Row() {Column() {Button(确定, { type: ButtonType.Capsule, stateEffect: true }).width(90%).height(40).fontSize(16).fontWeigh…

Python多线程使用(二)

使用多个线程的时候容易遇到一个场景&#xff1a;多个线程处理一份数据 使用多线程的时候同时处理一份数据&#xff0c;在threading中提供了一个方法&#xff1a;线程锁 Demo&#xff1a;下订单 现在有多笔订单下单&#xff0c;库存减少 from threading import Thread from t…

Java类的初始化顺序

类初始化顺序遵循以下三个原则&#xff08;优先级依次递减&#xff09; 1、静态对象&#xff08;变量&#xff09;优先于非静态对象&#xff08;变量&#xff09;初始化&#xff0c;其中静态对象&#xff08;变量&#xff09;只初始化一次&#xff0c;而非静态对象&…

【海思SS528 | VO】MPP媒体处理软件V5.0 | 视频输出模块——学习笔记

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

谈谈MYSQL索引

基本介绍 索引是帮助MySQL高效获取数据的数据结构&#xff0c;主要是用来提高数据检索的效率&#xff0c;降低数据库的IO成本&#xff0c;同时通过索引列对数据进行排序&#xff0c;降低数据排序的成本&#xff0c;也能降低了CPU的消耗。 通俗来说, 索引就相当于一本书的目录,…

WebGL笔记:图形缩放的原理和实现

缩放 1 &#xff09;原理 缩放可以理解为对向量长度的改变&#xff0c;或者对向量坐标分量的同步缩放 如下图&#xff0c;比如让向量OA 收缩到点B的位置&#xff0c;也就是从OA变成OB&#xff0c;缩放了一半 2 &#xff09;公式 已知 点A的位置是(ax,ay,az)点A基于原点內缩了…

CTF特训日记day2

day2打了一个叫NBCTF的比赛 做了四个题&#xff0c;剩下五道arm的题不会做了&#xff0c;关注一下wp&#xff0c;也许可以靠这个比赛提升一波异架构能力。 heapnotes 2.31简单堆题&#xff0c;没啥好说的&#xff0c;直接改got就行了 from re import L from pwn import * f…

Redis 入门、基础。(五种基本类型使用场景)

文章目录 1. 概况1.1 认识 NoSQL1.1.1 查询方式1.1.2 事务1.1.3 总结 2. 认识 Redis4. Redis 常见命令4.1 Redis 数据结构介绍4.2 Redis 通用命令4.3 Redis 命令之 String 命令4.4 Redis 命令的层级结构4.5 Redis 命令之 Hash 命令4.6 Redis 命令之 List 命令4.7 set 唯一不排序…

SparkSQL远程调试(IDEA)

启动Intellij IDEA&#xff0c;打开spark源码项目&#xff0c;配置远程调试 Run->Edit Configuration 启动远程spark-sql spark-sql --verbose --driver-java-options "-Xdebug -Xrunjdwp:transportdt_socket,servery,suspendy,address5005"参数说明&#xff1a;…

css实现简单的抽奖动画效果和旋转效果,还有春联效果

使用css的animation和transform和transition可以实现简单的图片放大缩小&#xff0c;旋转&#xff0c;位移的效果&#xff0c;由此可以延伸的动画效果还是挺多的&#xff0c;比如图片慢慢放大&#xff0c;图片慢慢旋转并放大&#xff0c;图片慢慢变化位置等等&#xff0c; 抽奖…

重新认识Word——样式

重新认识Word Word样式给所有一级标题加上一级标题样式修改标题一样式&#xff0c;符合要求 正文样式标题前的小黑点导航窗格样式的相互复制Word一键转PPT 话说回来&#xff0c;一个程序员平时可能还看不起office全家桶的软件&#xff0c;但是&#xff0c;在实际的生活运用中&a…

苍穹外卖面试题-下

17. 项目参与人员角色 项目经理&#xff08;1人&#xff09;&#xff1a;对整个项目负责&#xff0c;任务分配、把控进度 产品经理&#xff08;1人&#xff09;&#xff1a;进行需求调研&#xff0c;输出需求调研文档、产品原型等 UI设计师&#xff08;1人&#xff09;&#…

电商产品经理常用的ChatGPT通用提示词模板

电商产品规划和策略&#xff1a;请帮助我规划和制定电商产品的策略和计划&#xff0c;包括市场调研、用户需求分析、产品定位、竞争对手分析等方面的内容&#xff0c;以便我能够更好地把握市场机会并制定相应的发展策略。 电商产品设计和开发&#xff1a;请帮助我进行电商产品…

Canvas和SVG有什么区别?a元素除了用于导航外,还有什么作用?如何在页面上实现一个圆形的可点击区域?

Canvas和SVG有什么区别? svg 绘制出来的每一个图形的元素都是独立的 DOM 节点&#xff0c; 能够方便的绑定事件或用来修改。 canvas输出的是一整幅画布。 svg 输出的图形是矢量图形&#xff0c;后期可以修改参数来自由放大缩小&#xff0c;不会失真和锯齿 。而canvas 输出标量…

springboot 整合 RocketMQ 可用于物联网,电商高并发场景下削峰,保证系统的高可用

本文根据阿里云 RocketMQ产品文档整理&#xff0c;地址:https://help.aliyun.com/document_detail/29532.html?userCodeqtldtin2 RocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历了淘宝双十一的洗礼。RocketMQ既可为分布式应用系统…

内部培训平台的系统 PlayEdu搭建私有化内部培训平台

PlayEdu是由白书科技团队多年经营的线上教育系统&#xff0c;专为企业提供的全新企业培训方案 我们的目标是为更多的企业机构搭建私有化内部培训平台&#xff0c;以满足不断增长的培训需求 通过PlayEdu&#xff0c;企业可以有效地组织和管理培训资源&#xff0c;提供高质量的…

PriorityQueue类

PriorityQueue类 Java中的PriorityQueue是一个基于优先级堆的无界优先级队列。它是一个队列&#xff0c;可以按照元素的优先级顺序对元素进行排序&#xff0c;并且允许快速访问具有最高优先级的元素。它实现了Queue接口&#xff0c;继承了AbstractQueue类。 主要函数和方法&a…

AIGC: 关于ChatGPT中基于API实现一个客户端Client

Java版的GPT的Client 可作为其他编程语言的参考注意: 下面包名中的 xxx 可以换成自己的 1 &#xff09;核心代码结构设计 src main java com.xxx.gpt.client entity ChatCompletion.javaChatCompletionResponse.javaChatChoice.java… util Proxys.java… ChatApi.javaChatG…

C++的lambda语法

仿函数的最大缺点是&#xff1a; 如果命名不合规范并且没有给出注释&#xff0c;直接阅读难以理解&#xff08;排序的调用过程中&#xff0c;不查看仿函数细节&#xff0c;则很难直接得知是升序排序还是降序排序&#xff09;每次实现仿函数都需自己构建一个类 因此C从其他语言…