树形结构 一篇文章梳理

树形结构是一种非常重要的非线性数据结构,它模拟了具有层次关系的数据模型。在树形结构中,

目录

一、组成元素:

二、树的属性:

深度或高度

路径

路径长度

三、树的类型

1 二叉树

2 多叉树

3 完全二叉树

4 满二叉树

四、树形结构的应用

五、树形结构的操作:

1 遍历

2 插入

3 删除

4 搜索

五、代码事例

1 创建树

2 插入节点

3 删除节点

4 遍历树

5 查找节点

6 树的深度:

7 树的宽度

8 平衡树检查

六、树的变种和扩展

七、总结


数据元素(或称为节点)被组织成一系列的父子关系,形成了层次分明的结构。以下是关于树形结构的更多细节描述:

一、组成元素:

  • 根节点

树形结构的起始点,没有父节点,但可能有多个子节点。

  • 内部节点

除了根节点和叶节点之外的节点,通常既有父节点又有子节点。

  • 叶节点

没有子节点的节点,通常位于树的底部。

连接父节点和子节点的线,表示它们之间的关系。

二、树的属性:

深度或高度

从根节点到最远叶节点的最长路径上的节点数。

一个节点的子节点数。对于特定类型的树(如二叉树),每个节点的度受到限制。

路径

从树的一个节点到另一个节点所经过的节点序列。

路径长度

路径上经过的边的数量。

三、树的类型

1 二叉树

每个节点最多有两个子节点,通常称为左子节点和右子节点。特殊的二叉树如平衡二叉树、AVL树、红黑树等,在保持平衡的同时提供了高效的搜索性能。

2 多叉树

每个节点可以有多个子节点,例如n叉树。

3 完全二叉树

除了最后一层外,其他层的节点数都达到最大值,并且最后一层的节点都靠左对齐。

4 满二叉树

每一层的节点数都达到最大值。

四、树形结构的应用

文件系统目录和文件以树形结构组织,方便用户浏览和管理。

  1. HTML文档:DOM(文档对象模型)是一个树形结构,表示HTML文档的结构。
  2. XML和JSON数据:这些数据结构经常以树形方式表示和组织数据。
  3. 数据库索引:B树和B+树等数据结构常用于数据库索引,以加速数据检索。
  4. 决策树:在机器学习和数据挖掘中,决策树用于分类和回归任务。

五、树形结构的操作:

1 遍历

按照某种规则访问树的每个节点,常见的遍历方式有前序遍历、中序遍历和后序遍历(针对二叉树)。

2 插入

在树的适当位置添加新节点。

3 删除

从树中移除指定的节点,可能需要重新平衡树。

4 搜索

在树中查找具有特定属性的节点。

五、代码事例

树形结构的基本操作通常包括创建树、插入节点、删除节点、遍历树等。这里我将给出一个简单的树形结构示例,并使用Python编程语言来实现一些基本操作。

首先,我们定义一个树节点类:

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []

在这个类中,value 存储节点的值,children 是一个列表,存储该节点的子节点。

接下来,我们可以实现一些基本操作:

1 创建树

def create_tree():
    root = TreeNode("root")
    child1 = TreeNode("child1")
    child2 = TreeNode("child2")
    root.children.append(child1)
    root.children.append(child2)
    return root

这个函数创建了一个简单的树,根节点为 "root",有两个子节点 "child1" 和 "child2"。

2 插入节点

def insert_node(parent, value):
    new_node = TreeNode(value)
    parent.children.append(new_node)
    return new_node

这个函数在给定父节点下插入一个新的节点。

3 删除节点

def delete_node(node, value):
    for child in node.children:
        if child.value == value:
            node.children.remove(child)
            return True
    return False

(这里我们实现一个简单版本,只删除没有子节点的节点)

这个函数在给定节点下删除一个值为 value 的子节点。如果找不到这样的节点,函数返回 False。

4 遍历树

(这里我们使用前序遍历作为示例)

def preorder_traversal(node):
    if node is None:
        return
    print(node.value)
    for child in node.children:
        preorder_traversal(child)

这个函数以前序遍历的方式遍历树,并打印每个节点的值。

你可以使用这些函数来操作树形结构。例如:

root = create_tree()
insert_node(root, "child1.1")
preorder_traversal(root)  # 输出: root child1 child1.1 child2
delete_node(root, "child1.1")
preorder_traversal(root)  # 输出: root child1 child2

5 查找节点

查找树中是否存在具有特定值的节点。

def find_node(node, value):
    if node is None:
        return None
    if node.value == value:
        return node
    for child in node.children:
        result = find_node(child, value)
        if result is not None:
            return result
    return None

6 树的深度:

计算树的深度(即最长路径上的节点数)。

def tree_depth(node):
    if node is None:
        return 0
    max_depth = 0
    for child in node.children:
        child_depth = tree_depth(child)
        max_depth = max(max_depth, child_depth)
    return max_depth + 1

7 树的宽度

计算树的最大宽度(即某一层上节点数的最大值)。这通常需要使用队列来进行层序遍历。

from collections import deque

def tree_width(root):
    if root is None:
        return 0
    queue = deque([root])
    max_width = 0
    current_level = 0
    
    while queue:
        level_size = len(queue)
        if level_size > max_width:
            max_width = level_size
        for _ in range(level_size):
            node = queue.popleft()
            for child in node.children:
                queue.append(child)
        current_level += 1
    
    return max_width

8 平衡树检查

检查一棵树是否是平衡树。平衡树是指任意节点的左右子树的高度差不超过1。

def is_balanced(node):
    def height(node):
        if node is None:
            return 0
        left_height = height(node.children[0]) if node.children else 0
        right_height = height(node.children[1]) if len(node.children) > 1 else 0
        if left_height == -1 or right_height == -1 or abs(left_height - right_height) > 1:
            return -1
        return max(left_height, right_height) + 1
    
    return height(node) != -1

六、树的变种和扩展

  1. N叉树:每个节点可以有N个子节点。
  2. 森林:由多个不相交的树组成的集合。
  3. 二叉搜索树:二叉树的一种,其中每个节点的值都大于其左子树中任何节点的值且小于其右子树中任何节点的值。

七、总结

总的来说,树形结构是一个灵活且强大的工具,可以用于各种应用场景中数据的组织和处理。不同的树形结构类型和操作方式使得它们能够适应各种特定的需求,从而提供高效和可靠的数据管理方案。

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

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

相关文章

五十三佛_记录

个人笔记,斟酌阅读 《佛说观药王药上二菩萨经》云:若有善男子善女人及馀一切众生。得闻是五十三佛名者。是人於百千万亿阿僧祇劫不堕恶道。   若复有人能称是五十三佛名者。生生之处常得值遇十方诸佛。   若复有人能至心敬礼五十三佛者。除灭四重五…

C---流

最大流 最大流即为最大可行流,最大流的流量是所有可行流中最大的。 实现最大流算法,通常可以使用Ford-Fulkerson算法或它的改进版本Edmonds-Karp算法。这些算法基于图论中的网络流理论,用于在带权有向图中找到从一个顶点到另一个顶点的最大…

html5播放flv视频

参考:flv-h265 - npmHTML5 FLV Player. Latest version: 1.7.0, last published: 6 months ago. Start using flv-h265 in your project by running npm i flv-h265. There are no other projects in the npm registry using flv-h265.https://www.npmjs.com/packag…

基于springboot+mybatis调用MySQL存储过程

前言: 很多公司一般不使用JAVA写存储过程,因为写法较为复杂,不方便后期维护。 不排除一些公司项目会使用。 如果索引优化已经达到很好的性能,不建议使用。以下示例供学习参考: demo源码:https://gitee.com…

JDBC 笔记

课程地址 JDBC Java Database Contectivity 同一套 java 代码操作不同的关系型数据库 入门程序 创建工程,导入 jar 包。工程目录结构: public class JDBCDemo {public static void main(String[] args) throws Exception {// 注册驱动Class.forName(…

新品牌推广怎么做?百度百科创建是第一站

创业企业的宣传推广怎么做?对于初创的企业、或者品牌来说,推广方式都有一个循序渐进的过程,但多数领导者都会做出同一选择,第一步就是给自己的企业创建一个百度百科词条。在百度百科建立自己的企业、或产品词条,不仅可以树立相关信…

Windows11去掉 右键菜单的 AMD Software:Adrenalin Edition 选项

Windows11去掉 右键菜单的 AMD Software:Adrenalin Edition 选项 运行regedit打开注册表编辑器 先定位到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package找到 AdvancedMicroDevicesInc-2.…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十六)-UL-AoA 定位

前言 3GPP NR Positioning 5G定位标准:3GPP TS 38.305 V18 3GPP 标准网址:Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读(一)-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读(…

Unity类银河恶魔城学习记录10-10 p98 UI health bar源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili HealthBar_UI.cs using System.Collections; using System.Collections.G…

Unity PS5开发 天坑篇 之 申请开发者与硬件部署01

腾了好几天终于把PS5开发机调试部署成功, 希望能帮到国内的开发者, 主机游戏PlayStation/Nintendo Switch都是比较闭塞的,开发者账号是必须的。 开发环境有两个部分,一是DEV Kit 开发机, TEST Kit测试机两部分组成,二是Unity的支持库(安装后…

采用MQTT协议实现Android APP与阿里云平台的连接

前言 相信APP+单片机是很多同学毕设或者课设的模式,上学期做课设的时候用到了MQTT协议连接阿里云平台实现数据的通信,也是根据网上大佬的经验做的,中间也踩了很多坑。本文将介绍Android APP 通过MQTT协议与阿里云云平台连接的内容…

【矩阵】73. 矩阵置零【中等】

矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 解题思路 1、…

java数据结构与算法刷题-----LeetCode51. N 皇后

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路:时间复杂度O( N ! N! N!),空间复…

【IC设计】Verilog线性序列机点灯案例(一)(小梅哥课程)

文章目录 设计目标思路仿真结果时间点一:201ns时间点二:220ns时间点三:250,000,220ns时间点四:1,000,000,200ns时间点五:1,000,000,220ns 总结: 案例和代码来自小梅哥课程,本人仅对知识点做做笔…

Centos7安装ffmpeg

Centos7安装ffmpeg 用到的包压缩并安装 用到的包 压缩并安装 tar xvJf ffmpeg-5.0.1.tar.xz yum install -y gcctar -zxvf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make && make install yasm --versionyum install -y bzip2tar jxvf nasm-2.14.02.tar.bz2 cd n…

海格里斯HEGERLS托盘搬运机器人四向车引领三维空间集群设备柔性运维

随着市场的不断迅猛发展变化,在物流仓储中,无论是国内还是海外,都对托盘式解决方案需求量很大。顾名思义,托盘式解决方案简单理解就是将产品放置在托盘上进行存储、搬运和拣选。 面对托盘式方案需求,行业中常见的方案是…

git报: “fatal: detected dubious ownership in repository“

“fatal: detected dubious ownership in repository”的中文翻译是:“致命错误:检测到仓库中存在可疑的所有权问题”。 这句话意味着 Git 在检查代码仓库时发现所有权存在问题,可能是由于文件或目录的所有权与 Git 仓库预期的所有权不匹配。…

React18 后台管理模板项目:现代、高效与灵活

🎉 给大家推荐一款React18TypescriptVitezustandAntdunocss且超级好用的中后台管理框架 项目地址 码云:https://gitee.com/nideweixiaonuannuande/xt-admin-react18github:https://github.com/1245488569/xt-admin-react18 演示地址 http…

(done) 解释 python3 torch.utils.data DataLoader

特别注意:DataLoader 返回的迭代器是无尽的,依据如下 (CHATGPT3.5) DataLoader 返回的迭代器默认情况下是无尽的,因为它会无限地循环遍历数据集,以提供批量的数据。在训练神经网络时,通常会使用无尽的迭代器来循环遍历…

内存操作函数(C语言)

目录 memcpy使用和模拟实现 memcpy函数的模拟实现 memmove的使用和模拟实现 memmove的模拟实现 memset函数的使用 memcmp函数的使用 memcpy使用和模拟实现 mem--memory--记忆--内存 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置这…