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

🌈一、树的基本概念

☀️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,一经查实,立即删除!

相关文章

第九节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…

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基于原点內缩了…

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…

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

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

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

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

分类详情 API 返回值说明

为了进行此平台API的调用&#xff0c;首先我们需要做下面几件事情。 1、 获取一个KEY&#xff0c;点击获取测试key和secret 2、 参考API文档里的接入方式和示例。 3、查看测试工具是否有需要的接口&#xff0c;响应实例的返回字段是否符合参数要求。 4、利用平台的文档中心…

[前 5 名] 最顶级的数据恢复软件解决方案列表

您是否在互联网上找到适用于 Windows PC 的前 5 名最受好评的数据恢复软件解决方案&#xff1f;嗯&#xff0c;在线市场上有很多工具可以恢复已删除的文件。但并不是所有的应用程序都值得使用它。值得信赖的文件恢复工具将有助于快速检索丢失、删除、格式化的数据并从计算机恢复…

JVM之基本概念(一)

(1) 基本概念&#xff1a; JVM 是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与硬件没有直接的交互。 (2) 运行过程&#xff1a; 我们都…

听GPT 讲Rust源代码--src/tools(7)

File: rust/src/tools/rust-analyzer/crates/ide/src/inlay_hints/chaining.rs 在Rust源代码中&#xff0c;rust-analyzer/crates/ide/src/inlay_hints/chaining.rs这个文件的作用是生成Rust代码中的链式调用提示。 具体来说&#xff0c;当我们使用链式调用时&#xff0c;例如A…

Python练习题(三)

&#x1f4d1;前言 本文主要是【Python】——Python练习题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

51单片机PWM讲解

前言 51单片机我已经很久没用过了&#xff0c;毕竟是十年前的产物了&#xff0c;但是由于工作室的学弟学妹需要学习&#xff0c;加之马上就要举行循迹小车比赛&#xff0c;很多人反映看不懂PWM&#xff0c;或者看了不会用&#xff0c;于是写一篇文章简单介绍一下。 PWM普遍应…

IDEA如何配置Git 遇到问题的解决

新建项目 点击 会变红 会生成.git隐藏文件 配置远程仓库路径&#xff1a;点击Manage Remotes&#xff1a;将远程仓库的链接放到这里&#xff1a; 得到如下样式&#xff1a; 此时提交到本地仓库 点击add&#xff0c;添加到暂存文件&#xff1a; 此时文件变绿&#xf…

JDK中lock锁的机制,其底层是一种无锁的架构实现的,公平锁和非公平锁

简述JDK中lock锁的机制&#xff0c;其底层是一种无锁的架构实现的&#xff0c;是否知道其是如何实现的 synchronized与lock lock是一个接口&#xff0c;而synchronized是在JVM层面实现的。synchronized释放锁有两种方式&#xff1a; 获取锁的线程执行完同步代码&#xff0c;…

神经网络 代价函数

神经网络 代价函数 首先引入一些便于稍后讨论的新标记方法&#xff1a; 假设神经网络的训练样本有 m m m个&#xff0c;每个包含一组输入 x x x和一组输出信号 y y y&#xff0c; L L L表示神经网络层数&#xff0c; S I S_I SI​表示每层的neuron个数( S l S_l Sl​表示输出…