首页 > 其他分享 >数据结构之<树>的介绍

数据结构之<树>的介绍

时间:2023-12-17 22:01:55浏览次数:31  
标签:Tree 介绍 二叉 AVL 搜索 二叉树 数据结构 节点

树的基本概念

在数据结构中,树(Tree)是一种层次结构,由节点和边组成。树的基本概念包括根节点、子节点、父节点、兄弟节点等。节点拥有零个或多个子节点,除了根节点外,每个节点有且仅有一个父节点。树的层数称为树的高度。子节点以及它后续节点所形成的数称为子树。

1.二叉树(Binary Tree)

二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。

数据结构之<树>的介绍_二叉树

二叉树的基本概念:

  1. 节点(Node): 二叉树的基本构建单元,包含数据元素以及指向左右子节点的指针。
  2. 根节点(Root): 树的顶端节点,没有父节点。
  3. 叶子节点(Leaf): 没有子节点的节点称为叶子节点。
  4. 父节点、子节点、兄弟节点: 一个节点的直接上级是其父节点,直接下级是其子节点。具有相同父节点的节点互为兄弟节点。
  5. 深度(Depth): 节点的深度是从根节点到该节点的路径长度,根节点的深度为0。
  6. 高度(Height): 节点的高度是从该节点到其最远叶子节点的路径长度,叶子节点的高度为0。

二叉树有以下几种特殊形态:

1.1完全二叉树(Complete Binary Tree)

除了最后一层外,其他层的节点都是满的,且最后一层的节点从左到右连续排列。最后一层空缺的节点必须在右边,左边必须填满。

数据结构之<树>的介绍_二叉树_02

1.2满二叉树(Full Binary Tree)

每个节点要么没有子节点,要么有两个子节点。

数据结构之<树>的介绍_二叉树_03

1.3完美二叉树(Perfect Binary Tree)

所有叶子节点都在同一层,且每个非叶子节点都有两个子节点。

数据结构之<树>的介绍_子节点_04

2.平衡二叉树(Balanced Binary Tree)

平衡二叉树是一种特殊的二叉树,它的左子树和右子树的高度差不超过1。常见的平衡二叉树有AVL树和红黑树。

数据结构之<树>的介绍_子节点_05

3.二叉搜索树(Binary Search Tree)

二叉搜索树是一种有序的二叉树,对于每个节点,其左子树的值都小于该节点的值,右子树的值都大于该节点的值。这种特性使得在二叉搜索树中进行查找、插入和删除操作非常高效。

数据结构之<树>的介绍_二叉树_06

4.自平衡二叉搜索树

自平衡二叉搜索树是一种特殊的二叉搜索树,它在插入或删除节点时会自动调整树的结构,以保持树的平衡性。常见的自平衡二叉搜索树有红黑树和AVL树。

  • AVL树(AVL Tree):

数据结构之<树>的介绍_子节点_07

AVL树是一种高度平衡的二叉搜索树,它的每个节点都有一个平衡因子(Balance Factor),表示其左子树高度和右子树高度之差。AVL树满足以下性质:

  1. 每个节点的平衡因子只能是-1、0或1。
  2. 对于每个节点,其左子树和右子树的高度差的绝对值不超过1。

AVL树通过对节点进行旋转操作来保持树的平衡性。当插入或删除节点后,如果破坏了平衡性,AVL树会进行旋转操作来调整节点的位置,使得树重新平衡。相比于红黑树,AVL树的平衡性更加严格,因此在某些场景下,AVL树的查询效率可能更高。

  • 红黑树(Red-Black Tree):

数据结构之<树>的介绍_子节点_08

红黑树是一种具有自平衡性质的二叉搜索树。它的每个节点都有一个颜色属性,可以是红色或黑色。红黑树满足以下几个性质:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL节点,空节点)是黑色。
  4. 如果一个节点是红色,则它的两个子节点都是黑色。
  5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数量的黑色节点。

通过这些性质,红黑树可以保持树的平衡,使得树的高度相对较小,从而提高了查找、插入和删除操作的效率。红黑树的插入和删除操作可能需要进行旋转和颜色调整来保持平衡性。

一般来说,红黑树适用于插入和删除操作较多的场景,而AVL树适用于对查询操作有更高要求的场景。

二叉树的应用:

  1. 搜索和排序: 二叉搜索树可以用于快速搜索和排序。
  2. 表达式树: 二叉树可以用于表示数学表达式,便于求值和转换。
  3. 文件系统: 文件系统中的目录结构通常可以用二叉树表示。
  4. 哈夫曼树: 用于数据压缩算法中,构建最优编码树。
  5. 数据库索引: 数据库中的索引通常使用二叉树结构。

5.三叉树(Ternary Tree)

三叉树是一种每个节点最多有三个子节点的树结构。它可以用于表示多叉树的一种特殊情况。

数据结构之<树>的介绍_二叉树_09

6.多叉树(Multiway Tree)

多叉树是一种每个节点可以有多个子节点的树结构。每个节点的子节点数量可以是任意的。

数据结构之<树>的介绍_子节点_10


图片来源:峰华前端工程师

标签:Tree,介绍,二叉,AVL,搜索,二叉树,数据结构,节点
From: https://blog.51cto.com/xaye/8863641

相关文章

  • 【数据结构】第二章——线性表(1)
    导言  大家好,很高兴又和大家见面啦!!!从今天开始,我们将进入线性表的学习。  线性表是算法题命题的重点。这类算法题实现起来比较容易且代码量较少,但是要求具有最优的性能(时间复杂度、空间复杂度),因此,我们应该牢固掌握线性表的各种基本操作(基于两种存储结构),在平时的学习中多注重......
  • Kubernetes 网络之 DNS 介绍
    一、服务发现Pod提供的服务可以通过Service生成的ClusterIP(VIP)来访问。怎么知道某个应用的VIP呢?k8s主要有两种Service发现机制:环境变量和DNS。没有DNS服务的时候,k8s会采用环境变量的形式,但一旦有多个service,环境变量会变复杂,为解决该问题,我们使用DNS服务。环境变量在之......
  • 【python入门之OS模块介绍】---OS模块介绍
    title:【python入门之OS模块介绍】---OS模块介绍date:2023-12-1615:54:06updated:2023-12-1616:20:00description:【python入门之OS模块介绍】---OS模块介绍cover:https://home.cnblogs.com/u/dream-ze/【一】OS模块的介绍os模块是Python编程语言中......
  • 最好用的AI换脸软件,rope下载介绍
     随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope!先上两个动图,给大伙看看效果  rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深度神经网络的无数次迭代优化,最终得出的模型可以自动学习和识别视频中的人脸特征,它......
  • 【python基础之包介绍】---包
    title:【python基础之包介绍】---包date:2023-12-0618:54:06updated:2023-12-0619:20:00description:【python基础之包】---包cover:https://home.cnblogs.com/u/dream-ze/包【1】什么是包简介包是一个模块的集合,它可以将多个模块的功能组合到一起......
  • 数据结构时间复杂度
    复杂度分为时间复杂度和空间复杂度时间复杂度概念:若存在函数f(n)记作T(n)=O(f(n)).称O(f(n))为时间复杂度。T(n)为常熟操作执行次数简单理解,时间复杂度就是把T(n)简化为一个数量级,这个数量级可能为n,n^2`````` 1.常数阶这种与问题规模的大小无关(n的多少),执行时间恒定......
  • 数据结构绪论
    数据定义:数据是信息的载体,所有能被输入到计算机中,且能被计算机处理的符号的集合。例:在生活中的各种信息都可以作为数据来进行输入和处理。eg:图片·身份信息等。数据元素定义:数据元素是数据的基本单位,常被作为一个整体来考虑。例如:每个学生信息就是数据元素数据项定义:数据......
  • H3CNA-RS+——路由器交换机介绍
    路由器交换机介绍路由器的作用路由器的特点主要工作在OSI模型的物理层、数据链路层和网络层根据网络层信息进行路由转发提供丰富的接口类型支持丰富的链路层协议支持多种路由协议交换机的作用交换机的特点主要工作在OSI模型的物理层、数据链路层提供以太网间的透明桥接和交换依据链......
  • 数据结构与算法 第一章(48课时课程笔记)Data Structure and Algorithms
    数据结构基础知识 数据(Data):是对信息的一种符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。数据元素(DataElement):是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项(DataItem)组成。数据......
  • C++ AOP 编程介绍
    AOP(Aspect-OrientedProgramming)是一种编程范式,将程序的非核心逻辑都“横切”处理,实现非核心逻辑与核心逻辑的分离【1】在日常工作中,会遇到一类需求:统计业务处理的耗时或者加锁,业务函数可以动态替换而非侵入式修改业务函数;简单粗暴的方法是:RetProcess(...)//业务函数{......