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

🌈一、树的基本概念

☀️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);
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iptables——建立linux安全体系

目录 一. 安全技术类型 二. linux防火墙 1. 按保护范围划分&#xff1a; 2. 按实现方式划分&#xff1a; 3. 按网络协议划分&#xff1a; 4. 防火墙原理 三. 防火墙工具——iptables 1. netfilter 中五个勾子函数和报文流向 数据包传输过程&#xff1a; ① .五表四链…

设计模式-结构型模式之外观设计模式

文章目录 七、外观模式 七、外观模式 外观模式&#xff08;Facade Pattern&#xff09;隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口&#xff0c;来隐藏系统的复杂性。 这种模式涉及到一个单一的类&#xff0c;该类…

爬虫-xpath篇

1.xpath的基础语法 表达式描述nodename选中该元素/从根节点选取、或者是元素和元素间的过渡//从匹配选择的当前节点选择文档中的节点&#xff0c;而不考虑它们的位置.选取当前节点…选取当前节点的父节点选取属性text()选取文本 举例&#xff1a; 路径表达式结果html选择html元…

使用java批量生成Xshell session(*.xsh)文件

背景 工作中需要管理多套环境, 有时需要同时登陆多个节点, 且每个环境用户名密码都一样, 因此需要一个方案来解决动态的批量登录问题. XShell Xshell有session管理功能: 提供了包括记住登录主机、用户名、密码及登录时执行命令或脚本(js,py,vbs)的功能 session被存储在xsh文…

6-49.自定义的学生类

本题要求定义一个简单的学生类&#xff0c;数据成员仅需要定义学号和姓名&#xff0c;函数成员的原型见给出的代码&#xff0c;请给出函数成员的类外完整实现。 其中m_id和m_name分别表示学生的学号和姓名&#xff0c;类型已经定义好。类内声明了3个成员函数&#xff0c;分别表…

Linux docker批量安装软件

1.前提 具备docker-compose.yml 和 prometheus.yml 文件 常见报错&#xff1a; 1.没有配置network 配置network即可&#xff1a; 2.缺少相关依赖 docker-compose.yml加入相关配置 3.重复项 删除掉重复的 最后 执行 等待完成 下载后相当于有了这些软件包的镜像 启动的每…

大数据Hadoop-HDFS_架构、读写流程

大数据Hadoop-HDFS 基本系统架构 HDFS架构包含三个部分&#xff1a;NameNode&#xff0c;DataNode&#xff0c;Client。 NameNode&#xff1a;NameNode用于存储、生成文件系统的元数据。运行一个实例。 DataNode&#xff1a;DataNode用于存储实际的数据&#xff0c;将自己管理…

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展

11月25日&#xff0c;MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&a…

Langchain-Chatchat的安装过程

参考&#xff1a;LLMs之RAG&#xff1a;LangChain-Chatchat(一款中文友好的全流程本地知识库问答应用)的简介(支持 FastChat 接入的ChatGLM-2/LLaMA-2等多款主流LLMs多款embe_一个处女座的程序猿的博客-CSDN博客 1、安装过程中出现了 GPU驱动版本 是11.8 而 python -c "…

文心版吴恩达课程:语义核心(Semantic Kernel)插件的商业应用

文心版吴恩达课程&#xff1a;语义核心&#xff08;Semantic Kernel&#xff09;插件的商业应用 Semantic Kernel is an SDK that integrates Large Language Models (LLMs) like OpenAI, Azure OpenAI, and Hugging Face with conventional programming languages like C#, P…

HTTP 基本概念(计算机网络)

一、HTTP 是什么&#xff1f; HTTP(HyperText Transfer Protocol) &#xff1a;超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本地浏览器的协议…

【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结

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

SQL简介

目录 一、SQL 简史 二、数据库简史 1、Dr. Codds 对关系型数据库系统的十二条规则 2、设计数据库的结构 3、数据库的前景 4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下&#xff1a; 5、交互式语言 6、易于实现 7、SQL 总览 三、流行的 SQL 开发工具…

QT 中 QProgressDialog 进度条窗口 备查

基础API //两个构造函数 QProgressDialog::QProgressDialog(QWidget *parent nullptr, Qt::WindowFlags f Qt::WindowFlags());QProgressDialog::QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *…

Vue安装及环境配置详细教程

一、下载node.js 访问node.js官网&#xff1a;Download | Node.js 选择Windows Installer (.msi)的64-bit进行下载。 在E盘新建一个文件夹&#xff0c;取名为nodejs&#xff0c;也可以在其他盘符新建。 在安装node.js时&#xff0c;点击Change...&#xff0c;进行切换盘符安…

C#,数值计算——插值和外推,三次样条插值(Spline_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 三次样条插值 /// Cubic Spline Interpolation /// Cubic spline interpolation object. Construct with x and y vectors, and /// (optionally) values of the first…

Basemap地图绘制_Python数据分析与可视化

Basemap地图绘制 安装和使用地图投影地图背景在地图上画数据 Basemap是Matplotlib的一个子包&#xff0c;负责地图绘制。在数据可视化过程中&#xff0c;我们常需要将数据在地图上画出来。 比如说我们在地图上画出城市人口&#xff0c;飞机航线&#xff0c;军事基地&#xff0c…

mysql服务日志打印,时区不对的问题

查资料发现 原来日志的时区和服务器的时区不是一个参数控制的 log_timestamps 单独控制日志的时区 show global variables like log_timestamps;看到默认的是UTC&#xff0c;只需要修改为和系统一致就行 #数据库中直接修改 set global log_timestampsSYSTEM;#配置文件my.cn…

数据结构之哈希表

数据结构之哈希表 文章目录 数据结构之哈希表一、哈希概念二、哈希冲突三、哈希函数常见哈希函数 四、哈希冲突解决闭散列闭散列的思考线性探测线性探测的实现 二次探测 开散列开散列概念开散列的思考开散列实现 五、开散列与闭散列比较 一、哈希概念 顺序结构以及平衡树中&am…

【vSphere 8 自签名 VMCA 证书】企业 CA 签名证书替换 vSphere VMCA CA 证书Ⅱ—— 创建和添加证书模板

目录 3. 使用 Microsoft 证书颁发机构创建 VMCA 证书模板3.1 打开 Certificate Template Console3.2 复制模板修改 Compatibility 选项卡修改 General 选项卡修改 Extensions 选项卡确认新模板 4. 将新模板添加到证书模板4.1 打开 Certificate Console4.2 创建证书模板 关联博文…