二叉树的概念、表示法、性质和操作

news/2024/10/8 17:39:37/文章来源:https://www.cnblogs.com/green-cnblogs/p/18451096

本文记述了二叉树的基本概念、表示法、性质和操作。

◆ 概念

二叉树(以下也简称树)是一种存放多个元素的数据结构。每个元素称为结点,每个结点有左、右两个链接,每个链接要么指向其他结点,要么是空链接。

某个结点是它的左、右链接指向的结点的父结点,被指向的结点是其父结点的左或右子结点。没有父结点的结点称为根结点,没有子结点的结点称为叶子结点。

由于结点指向结点的递归特性,所以某个结点(X)的左、右子结点及后者递归指向的所有结点构成了以该结点(X)为根结点的左、右子树,且这两棵子树不相交。

从根结点到某个结点的路径称为内部路径。内部路径上的链接的数量为内部路径的长度。将一棵树中所有的内部路径长度加起来,就得到整棵树的内部路径长度。从根结点到某个叶子结点的空链接的路径称为外部路径。外部路径上的链接的数量为外部路径的长度。将一棵树中所有的外部路径长度加起来,就得到整棵树的外部路径长度。

以某个结点为终点的内部路径的长度,也称为此结点的深度或高度。所有结点的最大深度为二叉树的深度。

从根结点到叶子结点的路径上,依次给每个结点指定层号,根结点为第 1 层,根结点的子结点为第 2 层,依次类推。最后一层的层号为二叉树的层数。

所有叶子结点的深度都相同,且所有的非叶子结点都有两个子结点,这样的二叉树称为满二叉树。

从第一层到倒数第二层是满二叉树,且最后一层的所有结点都在此层左侧,这样的二叉树称为完全二叉树。

树中的任意结点要么有两个子结点要么没有子结点,这样的二叉树称为完满二叉树。

◆ 表示

二叉树常用倒置的树状形式直观地表示出来,如下图示例,

figure1

figure2

figure3

figure4

figure5

如果用层次法从上到下、从左到右对一棵满二叉树的结点连续编号,则编号为 k 的结点,其父结点的编号为 ⎣k/2⎦,其子结点的位置为 2k 和 2k+1。对于非满二叉树,可以考虑将没有结点的位置标注为空,这种顺序形式表示出来,如下图所示,

figure6

figure7

◆ 性质

  • 性质 1 :二叉树的第 i (≥ 1) 层上至多有 2^(i-1) 个结点。
  • 性质 2 :深度为 h (≥ 0) 的二叉树至多有 2^(h+1) - 1 个结点。
  • 性质 3 :二叉树中,叶子结点的个数比同时有左右子结点的结点的个数多 1 。
  • 性质 4 :有 N 个结点的完全二叉树的深度为 ⎣lg(N)⎦。 (lg 为以 2 为底的对数)
  • 性质 5 :完全二叉树中编号为 k (≥ 1) 的结点,若有父结点,其父结点的编号为 ⎣k/2⎦;若有子节点,其左右子结点的位置为 2k 和 2k+1。
  • 性质 6 :二叉树的外部路径长度比其内部路径长度多 2N 。

◆ 操作

二叉树的基本操作是遍历,即按照某种规则访问树中的每个结点一次。通常有前序遍历、中序遍历、后序遍历和层次遍历。

树的前序遍历操作为:

  1. 访问树的根结点;
  2. 前序遍历根结点的左子树(若有);
  3. 前序遍历根结点的右子树(若有)。

对于前述“一般形态二叉树”的树状形式和顺序形式的前序遍历过程,如下图所示,

figure8

figure9

树的中序遍历操作为:

  1. 中序遍历根结点的左子树(若有);
  2. 访问树的根结点;
  3. 中序遍历根结点的右子树(若有)。

对于上述例子的中序遍历过程,如下图所示,

figure10

figure11

树的后序遍历操作为:

  1. 中序遍历根结点的左子树(若有);
  2. 中序遍历根结点的右子树(若有);
  3. 访问树的根结点。

对于上述例子的后序遍历过程,如下图所示,

figure12

figure13

树的层次遍历操作为:

  1. 访问树的根结点;
  2. 从左到右访问树的第 2 层的所有结点;
  3. 从左到右访问树的第 i 层的所有结点,直到最后一层。

对于上述例子的层次遍历过程,如下图所示,

figure14

figure15

◆ 最后

写作过程中,笔者参考了《算法(第4版)》、软件设计师教程(第2版、Wolfram Mathworld。致各位作者。

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

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

相关文章

Springboot中统一启动多个socketIO

前言 这篇随笔属实没想到一个好名字,起因是在项目中遇到了一个springboot服务会发出多个socket服务的场景,而且我们使用的是socketIO服务,为了减少调试工作和重复的开发工作,让开发在项目中专注于业务编写,因此封装了一个在启动springboot服务时,自动创建socketIONamespa…

CSP 模拟9

CSP 模拟9 我也不明白学校模拟赛什么命名逻辑,凑合着看吧最唐的一集 邻面合并 这个直接状压就做完了,赛时早早想到做法,但是因为自己太唐把 \(0\) 写成 \(1\),在优秀大样例的助攻下挂掉 \(50\)点击查看代码 #include<bits/stdc++.h> using namespace std; using llt=…

南沙C++信奥赛陈老师解一本通题 1297:公共子序列

​【题目描述】我们称序列Z=<z1,z2,...,zk>Z=<z1,z2,...,zk>是序列X=<x1,x2,...,xm>X=<x1,x2,...,xm>的子序列当且仅当存在严格上升的序列<i1,i2,...,ik><i1,i2,...,ik>,使得对j=1,2,...,k,有xij=zjxij=zj。比如Z=<a,b,f,c> 是X=&l…

语音生成公司 ElevenLabs 估值达 30 亿美元;OpenAI Realtime API 很好也很贵丨RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编…

万兆加速计算卡设计资料保存:372-基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台

一、板卡概述 基于V7的高性能PCIe信号处理板,板卡选用Xilinx 公司Virtex7系列FPGA XC7VX690T-2FFG1761C为处理芯片,板卡提供两个标准FMC插槽,适用于高性能采集、回放以及相关处理。通过连接不同的FMC子卡的方式,可实现不同形式的数据采集、回放、处理的功能模块。板卡…

打造一站式应用内支付体验,助力开发者商业增长

随着移动互联网的发展,应用内支付已成为数字经济的重要组成部分。用户越来越追求便捷的支付体验,应用内支付服务提供的购买和订阅等能力满足了用户快速、无缝的支付需求,方便用户一站式完成交易,帮助开发者实现收入多元化。 HarmonyOS SDK应用内支付服务(IAP Kit)为用户精…

使用GRUB Multiboot2引导自制操作系统

使用GRUB Multiboot2引导自制操作系统 前言 之前花了一周时间,从头学习了传统 BIOS 的启动流程。惊讶于背后丰富的技术细节的同时,也感叹 x86 架构那厚重的历史包袱。毕竟,谁能想到,一个现代 CPU 竟然需要通过操作“键盘控制器寄存器”来启用一条地址线呢。 最终,出于兼容…

中电金信:源启数据建模平台:建模效率和管理精细度进一步提升

​源启数据建模平台是源启数据资产平台面向数据仓库等大型数据模型构建专门打造的模型设计工具。它以需求牵引模型动态演进,持续变更模型适应业务变化,并以Web和图形化方式,提供正向、逆向建模能力,高效复用模型资产和构建大型数据模型。同时,秉承“建模即治理”的思想,在…

是用python脚本清理reids连接

背景:测试环境的redis不知道咋回事突然无法连接,服务器登录查了一下发现连接数用完了。研发说雨女无瓜,测试环境删了没事,正事要紧赶紧恢复。得嘞!> info clients # Clients connected_clients:9997 # 连接中的数量 client_recent_max_input_buffer:54366 client_rece…

在Cucumber中应用 PicoContainer容器实现组件的实例化

通过 PicoContainer 这个轻量级的DI(Dependency Injection)组件容器进行组件的实例化, 相关介绍参考:http://picocontainer.com/introduction.html step1:定义一个ScenarioContext类 step2:添加jar依赖 implementation io.cucumber:cucumber-picocontainer:7.2.3 step3:…

查看交叉编译器的默认选项

1. 新建C文件mfloat.c#include <stdio.h> int main(void) { double a,b,c;a = 23.5436;b = 323.2348;c = b/a;printf("the result = %f\n", c);printf("hello world !\n");return 0; }2. 是 -v 选项 3. 显示结果如下

Starrocks模型表(一)

主键表优势:支撑实时数据更新的同时,也能保证高效的复杂即席查询性能 主键表中的主键具有唯一非空约束,用于唯一标识数据行,如果新数据的主键值与表中原数据的主键值相同,则存在唯一约束冲突,此时新数据会替代原数据应用场景实时对接事务型数据至StarRocks。事务型数据库…