树形结构 一篇文章梳理

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

目录

一、组成元素:

二、树的属性:

深度或高度

路径

路径长度

三、树的类型

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…

[Java、Android面试]_05_内存泄漏和内存溢出

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注收…

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…

C++中using 和 typedef 的区别

C中using 和 typedef 的区别_typedef using-CSDN博客 在C中,“using”和“typedef”执行声明类型别名的相同任务。两者之间没有重大区别。C中的“Using”被认为是类型定义同义词。此方法也称为别名声明。定义这些别名声明的工作方式类似于使用“using”语句定义C中…

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的操作并不总能将死元组的空间进行”物理截断…

React——关于JSX

JSX的概述 为什么要学习jsx? ​ 我们在初建react项目的时候,需要使用到react.creatElement去写虚拟dom,在编写过程中太繁琐不直观,不利于开发,而jsx就是解决这个问题,可以直接写一段类似HTML的代码去代替…

【设计模式】Java 设计模式之桥接模式(Bridge)

桥接模式(Bridge Pattern)深入解析 一、桥接模式概述 桥接模式是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式是一种非常有用的设计模式,在软件系统中,某些类型…

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

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

流程引擎接入设计

流程引擎接入设计 文章目录 流程引擎接入设计流程基础信息接入通用流程模型HDFS path删除工单类型工单流程图工单流程表与工单类型详细表关联关系流程基础信息 接入通用流程模型 交互过程 #mermaid-svg-UqP5icyFfibTMWRb {font-family:"trebuchet ms",verdana,aria…

JMeter 查看 TPS 数据,详细指南

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

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

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

centos防火墙firewall-cmd限定特定的ip访问

文章目录 firewall-cmd是什么?启动firewalld服务查看默认区域关闭端口访问添加富规则firewall-cmd的区域概念firewall-cmd的常用选项通用选项:状态选项:永久选项:区域选项: firewall-cmd是什么? firewall-…

Kubernetes基础(二十八)-K8S调度之拓扑分布TopologySpreadConstraints

1 引言 Kubernetes(K8s)是一款开源的容器编排平台,其调度系统能够智能地将容器化应用程序部署到集群中的节点。在分布式系统中,节点的负载均衡是至关重要的,而TopologySpreadConstraints(拓扑分散约束&…

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…