【C++】超详细!数据结构——树(一、树和二叉树Ⅰ)

【C++】超详细!数据结构——树(二、树与二叉树Ⅱ) 二叉树静态实现以及树的存储和遍历 阅读详情

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。

下续:
二、树和二叉树Ⅱ



1 树基本概念

1.1 术语介绍

1、每个元素叫节点node.
2、最顶上的节点叫树根root.
3、大树的一部分可以看作一棵小树,叫子树(一般用T来表示).
4、连着一个结点的上一层结点叫这个点的前驱,同样地,连着它的下(后)面的点叫后继;在一棵树中,除树根之外的任一一个节点只有一个前驱,但是可以有很不多不同的后记,而树根没有前驱.
5、一个结点后继的个数被称为它的度degree,而度数为0的点叫做树叶leaf,它们处在最后一层,是光的.
6、一棵树上根节点的层次level或layer为0(有时也会是1,看题目或实际情况需要),所有结点的层次的最大值为这棵树的深度depth,也叫高度height.
7、一个结点的子树的根节点是这个结点的孩子结点,而这个结点是它的孩子结点的父亲结点,与这个结点层次相同的是它的兄弟结点;比这个结点层次高的是它的子孙结点,反之,比他层次低的是它的祖先节点.(层次高,地位低;层次低,地位高)
8、一棵子树上的任意两点都是直接或间接相邻的,也就是说,从一个结点到另一个结点都有一条路径,这个路径的长度便是两点层次之差,也就是这条路径上点的个数-1.
9、许多不相交的树组在一起便形成了森林forest,而没有结点的树叫空树.
一棵简单的树
e.g.如上图,不难发现,根结点为A(树根),A的度数为2,它的后继是B和C,点B,D和E为树叶;A与E在同一棵子树上,它们之间的路径为(A, C, E),A层次为0,E层次为2,路径上有3个点,显然,路径长度为2.


2 二叉树

多叉树存储与基本操作与二叉树类似

2.1 二叉树的递归定义

递归定义详细内容如下:
#1、 二叉树没有根节点,成为一棵空树.
#2、 二叉树若不是空树,则它由树根、左子树、右子树构成 ,并且左子树与右子树也是二叉树.

重复1、2两步,直到所有分支都到了1.
如下图,A、B、C、D、E都是二叉树
叫它递归定义是因为它在用自身定义自身,就像在一个函数里调用这个函数一样;类似地,它也有一个递归边界和递归式,那么定义中,#1就是递归边界,#2是递归式.
说得再通俗一点:对于一个点,它有父亲结点,也有祖父结点,甚至于曾祖父结点;那么,按照递归定义,祖父节点就是父亲节点的父亲结点,曾祖父结点就是父亲结点的父亲结点的父亲结点;同理,它的儿子结点就是它的孙子结点的父亲结点,依此类推.

2.2 简单而特殊的二叉树

五个二叉树

2.2.1 满二叉树

术语定义:每一层的结点个数都达到了当层能达到的最大结点数.
白话定义:满满当当,不增加层数的情况下不能再加点的树.
图E就是一棵满二叉树,但其它几个图不是.

2.2.2 完全二叉树

定义:不看最后一层,这个二叉树是满二叉树;最后一层中,结点从左至右并且连续一字排开,但不要求排满;也就是说,最后一层最左边要有一个结点,最后一层的结点是连续不断的.
如图D、E是完全二叉树,但其它几个图不是.

2.3 二叉树的存储结构与基本操作

2.3.1 二叉树的存储与创建

这里,我们用链表来存储二叉树,先上代码:

struct node {
   
   
	typename data;    //数值域,typename为任意类型
	node* lchild;     //指向左子树树根的指针
	node* rchild;     //指向右子树树根的指针
};
node* root = NULL;    //最开始是一个空树

上述结构体中,在node中又定义了node,这就是递归的体现.
上面的代码仅仅是存储的容器的类型,下面,我们就要新建一个容器,并向容器里填充树.
让我们先建立一个初始的根节点:

//生成一个新结点,v为结点权值
node* nowRoot(typename v) {
   
   
	node* Node = new node;      //申请一个node类型的地址空间,创建一棵树
	Node->data = v;          //结点权值为v
	Node->lchild = Node->rchild = NULL;     //初始状态下没有左右孩子
	return Node;              //返回新结点地址
}

这样,我们就完成了一个树根的创建,也就完成了一个树的创建.

2.3.2 二叉树的查找与修改

这是新建结点的前提
先上代码:

void change(node* root, typename x, typename newdata) {
   
   
	if(root == NULL)         //递归边界,到空树就回溯
		return;
	
	if(root->data == x) {
   
        //找到了,改掉
		root->data = newdata;
	}
	
	//递归式
	search(root->lchild, x, newdata);     //搜左孩子
	search(root->rchild, x, newdata);     //搜右孩子
}
2.3.3 二叉树插入结点与创建

先是插入结点:

//insert函数将在二叉树中插入一个数据域为X的新结点
//注意根结点指针root要使用引用,否则插入不会成功
void insert(node* &root, int x) {
   
   
	//递归边界,如是碰到了树叶(死胡同),就插入
	if(root == NULL) {
   
   
		root = nowNode(x);
		return;
	
B树的表示及基本操作的实现。 B树的表示及基本操作的实现。 1.掌握B树的存贮结构。 2.实现B树中关键字值的插入及删除操作。 3.练习屏幕图形化的显示。 立即下载

相关推荐

ROS探索篇(一)在Gazebo中实现移动机器人仿真与环境搭建

$x+y=z$

weixin_52029211的博客 4621

RimWorld Mod开发避坑指南:从Defs命名规范到XML结构详解(附实战代码)

本文深入解析RimWorld Mod开发中Defs文件的编写规范与高级技巧,涵盖命名冲突预防、XML结构优化及高级功能实现。通过实战代码示例,帮助开发者避开常见陷阱,提升Mod兼容性与稳定性,特别适合RimWorld Mod开发者参考。

weixin_30790841的博客 451

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

【即插即用模块】Transformer篇 | MICCAI 2025 | ReLULA:Q/K双ReLU线性注意力,既轻又准!

本文介绍了一种基于线性注意力的多实例学习模块(Lin-MIL),适用于高分辨率视觉任务。该模块通过转置计算顺序和使用ReLU激活,将计算复杂度从O(n²d)降至O(nd²),同时提升特征判别性。核心创新包括Q/K双ReLU激活、可学习温度系数和数值稳定归一化。实验表明,该模块在轻量化视觉任务中优于传统线性注意力和Mamba架构。代码实现了模块化矩阵乘法,支持即插即用替换ViT自注意力层。该模块特别适合计算病理学等需要处理大量图像补丁的任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 140

【27】软考软件设计师——数据流图(DFD)补全题满分精讲|下午15分大题深度拆解

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第27篇,深度精讲**下午案例题第1道必考大题:数据流图(DFD)补全**,该题单题分值高达**12 ~ 15分**,是整张试卷最稳的保底得分大题。我结合多年备考复盘与真题阅卷规则,超详细拆解DFD四大核心元素标准定义、机考绘图规范、三层分层逻辑、**父图子图平衡刚性扣分规则**,升级强化版「DFD满分补全三步法」;复刻历年高频真题完整流程,拆解缺失数据流定位、实体/存储辨析、平衡改错、文字需求对照全流程,配套**阅卷满分答题话术、机考避坑细则

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 590

基于FPGA的相控阵雷达波束控制系统设计(2)

也就是在计算波控码时0,按2.8125递增,取遍-90

qq_43416206的博客 1812

串口通信协议

文章目录前言一、串口通信结构图二、电平三、串口通信协议 前言 本文记录的是平时常用的串口通信有关知识点 提示:以下是本篇文章正文内容,下面案例可供参考 一、串口通信结构图 1、RS232标准串口通讯结构图 2、USB转串口通讯结构图 3、原生的串口到串口 二、电平 串口通信的时候,有三种电平:TTL电平、RS232电平、USB电平 TTL电平是从MCU直接出来的电平 RS323是一种通讯标准,因为高电平+15V低电平–15V电位差30V容错空间大,抗干扰能力强,一般用于工业设备直接通信电平转换芯

weixin_43772611的博客 6851

07 Zabbix 微信告警

Zabbix 微信告警 1.注册企业微信 企业微信注册地址:https://work.weixin.qq.com 2.进入企业微信后台管理 2.1 添加微信成员 2.2创建应用 2.3 获取四项数据 (1)AgentID (2) Secret (3) 企业ID (4)部门ID 3.Zabbix Server配置 3.1确认脚本目录 # grep alertscripts /etc/zabbix/zabbix_server....

Jian Sun_的博客 1297

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 01穷举(01枚举)算法详解
下一篇: 【C++】超详细!数据结构——树(二、树与二叉树Ⅱ)
zhengziao
博客等级 码龄6年 14粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值