树形结构 一篇文章梳理

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

目录

一、组成元素:

二、树的属性:

深度或高度

路径

路径长度

三、树的类型

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 = valueself.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 Truereturn False

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

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

4 遍历树

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

def preorder_traversal(node):if node is None:returnprint(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 Noneif node.value == value:return nodefor child in node.children:result = find_node(child, value)if result is not None:return resultreturn None

6 树的深度:

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

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

7 树的宽度

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

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

8 平衡树检查

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

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

六、树的变种和扩展

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

七、总结

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

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

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

相关文章

【计算机网络_传输层】UDP和TCP协议

文章目录 1. 重新理解端口号端口号划分netstat指令pidof 2. UDP协议2.1 UDP协议端格式2.2 UDP的特点2.3 UDP的注意事项2.4 基于UDP的应用层协议 3. TCP协议(传输控制协议)3.1 TCP协议的格式和报头字段3.2 如何解包和分用3.3 理解TCP协议报头3.4 TCP协议的…

day-20 二叉树的层序遍历

思路:利用队列进行广度优先遍历即可 注意点:ArrayList执行remove之后,索引i会立即重排,注意可能越界 code: /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeN…

Xcode调试Qt 源码

在Mac下使用Xcode 开发Qt程序,由于程序断点或者崩溃后,Qt库的堆栈并不能够正确定位到源码的cpp文件,而是显示的是汇编代码,导致不直观的显示。 加载的其他三方库都是同理。 所以找了攻略和研究后,写的这篇文章。 一&a…

SIP调试之SIPP测试工具

SIPP是针对SIP协议的一个性能测试的命令行工具,可以动态显示测试的统计信息(如呼叫速率、延时、消息统计等)。用户可以通过XML场景配置文件,自定义模拟各种UAC/UAS测试场景的信令交互流程,可以被用来测试IP话机、SIP代…

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

文章目录 该系列目录:设计目标设计思路RTL 及 Testbench仿真结果存在的问题?改善后的代码RTL代码testbench代码 仿真结果 案例和代码来自小梅哥课程,本人仅对知识点做做笔记,如有学习需要请支持官方正版。 该系列目录:…

Nexus如何导入jar以及批量导入Maven的本地库目录

上传依赖包到Nexus 服务器的方式有多种, 包含: 1.单个jar上传: 在Nexus管理台页面上传单个jar 2.源码编译上传:在源码项目中使用 Maven的deploy 命令发布 3. 使用脚本批量上传Maven本地库的目录 前言 本篇基于 Nexus 的版本是 nexus-3.55.0-01本方法适用Linux和WindowsWind…

MySQL-HMA 高可用故障切换

本章内容: 了解MySQL MHA搭建MySQL MHAMySQL MHA故障切换 1.案例分析 1.1.1案例概述 目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA…

【四 (2)数据可视化之 Matplotlib 常用图表及代码实现 】

目录 文章导航一、介绍二、安装Matplotlib三、导入Matplotlib四、设置可以中文显示四、常用图形1、散点图(Scatter Plot)2.1、线性图(Line Plot)2.2、堆叠折线图2.3、多图例折线图3.1、柱状图/条形图(Bar Chart&#x…

PostgreSQL中vacuum 物理文件truncate发生的条件

前言 前段时间,有些同学说到vacuum截断的行为时,认为,只要末尾是空页,无论多少,都会被截断,真是这样的吗? PostgreSQL当中,由于vacuum的操作并不总能将死元组的空间进行”物理截断…

HNU-计算机系统-实验1-原型机vspm1.0-(二周目玩家视角)

前言 二周目玩家,浅试一下这次的原型机实验。总体感觉跟上一年的很相似,但还是有所不同。 可以比较明显地感觉到,这个界面越来越好看了,可操作与可探索的功能也越来越多了。 我们HNU的SYSTEM真的越来越好了!&#x…

JMeter 查看 TPS 数据,详细指南

TPS 是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。在 JMeter 中,我们可以使用以下方法查看 T…

量子遗传算法优化VMD参数,五种适应度函数任意切换,最小包络熵、样本熵、信息熵、排列熵、排列熵/互信息熵...

关于量子遗传算法,在众多文献均有应用。下面简述一下原理。 (1)量子比特编码 子遗传算法通过引入量子比特来完成基因的存储和表达。量子比特是量子信息中的概念,它与经典比特不同,是因为它可以在同一时刻处于两个状态的…

Unreal发布Android App如何面对混乱的Android SDK开发环境

Unreal发布Android App如何面对混乱的Android SDK开发环境 混乱的Android SDK开发环境Unreal 4可以借用Unity3D安装的Android环境Unreal 5需要安装Android Studio开发环境Android Studio的DK版本目录处理gradle和java版本gradle提示错误总结 混乱的Android SDK开发环境 Unreal…

Python爬虫 Day1

要注意看网页的请求方式是request还是get 一、小型爬虫 (爬百度首页) from urllib.request import urlopen url "https://www.baidu.com" resp urlopen(url) print(resp.read().decode(utf-8)) print("over!") //!&am…

【Hadoop】Hadoop概述与核心组件

目录 Hadoop概述Hadoop 发展历史Hadoop 三大发行版本1.Apache Hadoop(常用)2.Cloudera Hadoop3.Hortonworks Hadoop优势优势总结——4高(高可靠、高扩展、高效、高容错) Hadoop组成1.HDFS管理者:NameNode(n…

css3 实现html样式蛇形布局

文章目录 1. 实现效果2. 实现代码 1. 实现效果 2. 实现代码 <template><div class"body"><div class"title">CSS3实现蛇形布局</div><div class"list"><div class"item" v-for"(item, index) …

音视频如何快速转二维码?在线生成音视频活码的教程

音频文件的二维码制作步骤是什么样的呢&#xff1f;扫描二维码来展现内容是很流行的一种方式&#xff0c;基本上日常生活中经常会用的图片、音频、视频等都可以使用生成二维码的方式。现在很多的幼儿园或者学校会录制孩子的音频或者视频内容用来展示&#xff0c;那么二维码制作…

鸿蒙开发实战:【音频组件】

简介 音频组件用于实现音频相关的功能&#xff0c;包括音频播放&#xff0c;录制&#xff0c;音量管理和设备管理。 图 1 音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样&#xff0c;获取到离散时域上离散信号的过程。 采样率 采样…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:RelativeContainer)

相对布局组件&#xff0c;用于复杂场景中元素对齐的布局。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 规则说明 容器内子组件区分水平方向&#xff0c;垂直方向&#xff1a; 水平方向为left&…

HTTPS的工作过程

一、HTTPS 是什么 HTTPS 也是⼀个应用层协议&#xff0c;是在 HTTP 协议的基础上引入了⼀个加密层. HTTP 协议内容都是按照文本的方式明文传输的。这就导致在传输过程中出现⼀些被篡改的情况. 在互联网上, 明文传输是比较危险的事情!!! HTTPS 就是在 HTTP 的基础上进行了加密…