暴击一棵树——二叉树入门一(入门基础概念)

news/2024/5/17 6:12:12/文章来源:https://blog.csdn.net/m0_62338174/article/details/129960893

 

目录

1.树的概念

2.二叉树的概念

二叉树(Binary Tree)

满二叉树(Full Binary Tree)

完全二叉树(Complete Binary Tree)

3.堆和二叉树

4、二叉树的结构

1.二叉树的逻辑结构

2.二叉树的物理结构


1.树的概念

树(Tree)是一种非常常见的数据结构,它是由若干个节点(Node)组成的层次结构,其中一个节点作为根节点(Root),其他节点按照一定规则分层连接。每个节点可以有任意多个子节点,也可以没有子节点。如下图所示是一棵简单的树:

        A/ | \B  C  D/ \   /|\E  F  G H I

在这个例子中,节点 A 是根节点,B、C、D 是 A 的子节点;B 又有 E、F 两个子节点,D 又有 G、H、I 三个子节点。

树的主要应用场景包括:文件系统、目录结构、程序执行流程、HTML/XML 文档对象模型等等。下面是一些树相关的术语:

  1. 节点的度数(Degree):指其拥有的子节点数。
  2. 叶子节点(Leaf Node):没有子节点的节点称为叶子节点(也叫终端节点)。
  3. 父节点(Parent Node):若一个节点有子节点,则这个节点是其子节点的父节点。
  4. 子节点(Child Node):一个节点下面的直接连接的节点称为其子节点。
  5. 兄弟节点(Sibling Node):拥有同一父节点的节点互为兄弟节点。
  6. 树的深度(Height):指树中节点的最大层数,即从根节点到最远叶子节点的距离。
  7. 子树(Subtree):以某个节点为根节点,它下面的所有节点和连线所组成的树形结构。

在实际应用中,树可以通过多种方式来表示和实现,例如采用指针、数组、哈希表等数据结构来存储节点和连接关系。常见的树结构包括二叉树、平衡树、B 树、红黑树等,在这些树结构基础上还可以派生出各种高级数据结构,如堆、哈夫曼树、字典树等等。

2.二叉树的概念

二叉树(Binary Tree)

是一种特殊的树形结构,它由若干个节点组成,这些节点中最多只有两个子节点。通常将左侧节点称为左子节点(Left Child),右侧节点称为右子节点(Right Child)。如果一个节点没有子节点,那么它就是一个叶子节点(Leaf Node)。每个节点都可以有零个、一个或两个子节点。

下面是一个简单的二叉树示例:

       1/   \2     3/  \   / \4   5  6   7

在这个二叉树中,节点1是根节点,节点2和节点3是1的子节点;节点2又有两个子节点4和5,节点3也有两个子节点6和7。

二叉树的应用非常广泛,例如在排序算法中,二叉树可以用于快速查找和排序数据;在计算机科学中,二叉树可以用于存储程序代码的语法分析树;在图形学中,二叉树可以用于实现平衡搜索树(AVL Tree)等等。

需要注意的是,二叉树不同于二叉搜索树(BST),前者只是树的一种特殊形式,而后者是基于二叉树的一种高效的数据结构。

满二叉树(Full Binary Tree)

是一种特殊的二叉树,其中每个节点都恰好有0个或2个子节点。也就是说,如果一个节点有一个子节点,那么它肯定没有另一个子节点。满二叉树的节点总数为 2h−12h−1,其中 hh 是树的高度。

下面是一个满二叉树的例子:

          1/     \2       3/  \     /  \4    5   6    7

在该满二叉树中,每个节点都恰好有0个或2个子节点。

完全二叉树(Complete Binary Tree)

则是指除了最后一层外,其他层都被填满,最后一层从左边开始连续地填充节点。也就是说,如果最后一层不是满的,只能缺失右侧的连续若干节点。

下面是一个完全二叉树的例子:

          1/     \2       3/  \     /4    5   6

在该完全二叉树中,最后一层缺失了一个右侧的节点6,但仍然保持了从左至右连续填充节点的规则。需要注意的是,满二叉树是完全二叉树的一种特殊情况。满二叉树中每个节点都有两个子节点,因此如果把它的最后一层填满,就可以得到一个完全二叉树。反之,如果一个完全二叉树(除了最后一层)也是满二叉树,那么它的最后一层就必须也是满的。

3.堆和二叉树

堆是一种特殊的二叉树,通常用来实现优先队列。堆可以看做一个完全二叉树,其中每个节点的值不小于(或不大于)它的子节点的值,被称为最大堆或最小堆。堆和普通的二叉树的主要区别在于它们的结构和性质。与普通的二叉树不同,堆必须满足以下两个条件:

1.堆是一棵完全二叉树

堆是一种完全二叉树,也就是说,如果将堆中的所有元素从上到下、从左到右依次编号,则这些编号必须恰好对应完全二叉树中的结点编号。这个性质保证了堆的高度尽可能小,也保证了堆中元素的分布比普通的二叉树更加紧凑。

2.堆中每个节点的键值都不大于/不小于其父节点的键值

这是堆的核心性质,也是实现优先队列功能的关键。对于最大堆来说,堆中的任何一个非叶子结点的键值都不小于其子节点的键值,因此堆顶元素是堆中最大的元素。而最小堆则相反,非叶子结点的键值都不大于其子节点的键值,堆顶元素是堆中最小的元素。通过这个性质,堆可以保证堆顶元素是优先级最高(或最低)的元素,使得用堆实现优先队列的操作变得简单且高效。

综上所述,堆和普通的二叉树相比,具有独特的结构和核心性质,使其成为了一种高效的数据结构,广泛应用于算法设计和实现中。

4、二叉树的结构

逻辑结构表示了树中节点之间的关系,二叉树的物理结构指的是如何在计算机中存储和表示这棵二叉树。

1.二叉树的逻辑结构

从逻辑上看,二叉树是由若干个节点和这些节点之间的关系构成。具体来说,每个节点包含一个数据元素和两个指向左右子节点的指针,如果某个节点没有左子节点或者右子节点,则对应的指针为空。节点之间的关系可以描述为:“根节点与子节点的连接”、“父节点与子节点的连接”、“兄弟节点之间的关系”等。

二叉树的逻辑结构有许多特殊的形态,例如满二叉树、完全二叉树、平衡二叉树等等。这些特殊的形态在算法设计和实现中都有着重要的作用。

2.二叉树的物理结构

二叉树的物理结构有多种不同的实现方式,常见的方法包括顺序存储和链式存储。

顺序存储:顺序存储是将二叉树存储在数组中,通过数组下标实现对节点的引用。对于一棵深度为 k 的二叉树,最多有 2k+1−12k+1−1 个结点,因此可以使用大小为 2k+12k+1 的数组存储二叉树。在顺序存储的方式中,每个节点都占用一个数组元素,空节点则用一个特殊的值表示。

链式存储:链式存储是通过指针来实现对二叉树节点的引用。在链式存储中,每个节点都包含数据元素和左右子节点的指针,这些指针指向左右子节点的内存地址。与顺序存储不同,链式存储方式不需要预先知道二叉树的大小,也可以动态地插入或删除节点。

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

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

相关文章

《钢琴调律师 五级》 笔记

声音产生的三个条件:物体振动、媒质传播、人耳接收 复合音:由一些频率不同的简谐成分合成的声音。大多数乐器都是复合音,因此才各有不同的音色特征 纯音:物体做简谐振动所产生的声音 乐音:指有较为明确音调感的声音。噪…

spark第七章:SparkStreaming实例

系列文章目录 系列文章目录 spark第一章:环境安装 spark第二章:sparkcore实例 spark第三章:工程化代码 spark第四章:SparkSQL基本操作 spark第五章:SparkSQL实例 spark第六章:SparkStreaming基本操作 spa…

javaEE+jsp820高校校园设备报修系统dzkfa9程序mysql

1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和验证码,然后对登录进来的用户判断身份信息,判断是管理员用户还是普通用户。 2.系统用户管理:不管是…

从C出发 13 --- 多维数组

数组的本质是数据集合,我们在程序里面操作数组,就是在操作数据 数组中的元素能不能是其他程序元素? 这个说法只是表示数组里面的元素是int 类型 而这个数组的类型是 int [5] 由元素类型和数组大小共同决定 int a[10] {0}; // a的类型 : int[10]…

文件小注意

目录 0 前言 1 标识 O_CREAT O_APPEND 2 ftruncate与truncate 3 O_DIRECT与O_DSYNC、O_SYNC 4 open与fopen 5 关于mmap 0 前言 文件操作在软件开发中是很常见的一件事。虽然与它相关的工作看起来不怎么起眼,无非就是通过通过open、read、write、close几个调用…

【MySQL】主从复制过程(实践)

1.安装好2台数据库服务器的系统,然后安装好MySQL软件 [rootjd-mysql ~]# mysql --version mysql Ver 14.14 Distrib 5.7.40, for linux-glibc2.12 (x86_64) using EditLine wrapper[rootjd-mysql-2 ~]# mysql --version …

第03章_用户与权限管理

第03章_用户与权限管理 1. 用户管理 ​ MysQL用户可以分为普通用户和root用户。root用户是超级管理员,拥有所有权限,包括创建用户 、删除用户和修改用户的密码等管理权限;普通用户只拥有被授予的各种权限。 MysQL提供了许多语句用来管理用户账号&#…

认识C++字符串复合类型

目录 前言: 1.数组 1.1C的数组 1.2C数组初始化 *2.字符串 2.1字符串与数组 2.2字符数组的存储 2.3字符串输入cin 2.4cin.getline() 2.5cin.get() 2.6函数重载例子 2.7混合输入数字和字符串 前言: C与C语言在内容上有些是一样的,也…

Zooker配置与测试

目录 1.介绍 2.配置 1.配置准备 2.配置修改 3.测试 1.介绍 2.配置 1.配置准备 zookeeper官网:Apache ZooKeeper (1)安装 JDK (2)拷贝 apache-zookeeper-3.5.7-bin.tar.gz 安装包到software目录下 (3)解…

mysql常用的基础命令

通过学习mysql命令提高数据处理和工作效率 基础命令 1.登录MySQL mysql -u root -p 2.查看当前系统所有数据库 show databases; 3.切换数据库 use 数据库名称 4.查看数据库下的所有表 show tables; 5.查看表结构; desc 表名; 6.创建数据库 crea…

CentOS7的下载、安装和配置(详细图解)

CentOS7安装包的下载 Centos7的安装包可以去官网(https://www.centos.org/)下载,但速度比较慢。 也可以用搜索引擎搜索国内镜像站点的安装包文件与官网同步,下载的速度非常快。 CentOS7软件安装包的分享 百度网盘分享&#xff…

python函数详解_INDEX函数

一. 函数的作用 函数就是将一段具有独立功能的代码块 整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求。 函数在开发过程中,可以更高效的实现代码重用。 二. 函数的使用步骤 1. 定义函数 def 函数名(参数):代码1代码2...... 复制 …

usb_cam相机录制rosbag

文章目录运行环境:1.1 usb_cam连接:1.2 usb-cam启动1.2 查看相机话题名称2.1 rosbag录制2.2 播放rosbag运行环境: ubuntu20.04 noetic 杰瑞微通usb_cam(分辨率640x480) 宏基暗影骑士笔记本 1.1 usb_cam连接&#xff…

Golang每日一练(leetDay0030)

目录 88. 合并两个有序数组 Merge Sorted Array 🌟 89. 格雷编码 Gray Code 🌟🌟 90. 子集 II Subsets II 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/…

Linux复习 / 进程控制QA梳理

文章目录前言Q&A进程终止Q:exit和_exit的区别?Q:内核是如何终止进程的?进程等待Q:为什么要等待子进程?Q:如何等待子进程(wait/waitpid的区别)?进程替换Q&…

TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

目录 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 UDP和TCP对比 滑动窗口 由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的…

【Linux】环境变量进程虚拟地址空间

环境变量&进程虚拟地址空间环境变量一些常见的环境变量-PATH修改环境变量进程虚拟地址空间环境变量 使用ls man pwd cd echo 这些指令时,不需要加./但是要运行我们自己的可执行程序就需要加上,本质上两个都是指令,为什么执行方法不同&am…

python学习之http客户端和服务端

Part1前言python非常简洁,非常适合写小功能以及测试接口。本文主要记录用pyhon实现一个简单的http客户端和服务端。Part2http客户端这里采用request库来实现。示例如下import requests import json url http://127.0.0.1:81/test?key1123&key2456headers {Au…

代码不熟没关系,让AI替你写

程序员早已不是一个陌生的群体,但程序、代码相对普通人而言,看着还是比较深奥难懂,但自从有了ChatGPT,不少对此有兴趣的外行人士,也能轻松写出代码了,比如让ChatGPT写一个贪吃蛇游戏,按它给出的…

【如何使用Arduino控制WS2812B可单独寻址的LED】

【如何使用Arduino控制WS2812B可单独寻址的LED】 1. 概述2. WS2812B 发光二极管的工作原理3. Arduino 和 WS2812B LED 示例3.1 例 13.2 例 24. 使用 WS2812B LED 的交互式 LED 咖啡桌4.1 原理图4.2 源代码在本教程中,我们将学习如何使用 Arduino 控制可单独寻址的 RGB LED 或 …