数据结构-树

目录

概念

结点分类

根结点

结点的度(De-gree)

树的度

结点间关系 

孩子(Child)、双亲(Parent)

 兄弟(Sibing)、堂兄弟(Cousins)

祖先(ancestor)、 子孙(descendant)

结点的层次(Level)、树的深度(Depth)

有序树、无序树、森林(Forest)

总结

线性结构和树结构的差异


概念

  • 树(Tree)是 n(n >= 0) 个结点的有限集
    • 若 n = 0 为空树
    • 若 n > 0
      • 有且仅有一个特定的,称为根(Root)的结点
      • 其余结点可分为 m(m >= 0) 个互不相交的有限集T₁,T₂,...,Tₙ,其中每一个集合本身又是一棵树,称为根的子树(SubTree)

结点分类

根结点

  • 非空树中无前驱结点的结点

结点的度(De-gree)

  • 结点拥有的子树的个数
  • 度为0的结点称为叶结点(Leaf)或终端结点
  • 度不为0的结点称为非终端结点或分支结点
    • 除了根结点之外,分支结点又称为内部结点

树的度

树内各结点的的度的最大值


结点间关系 

孩子(Child)、双亲(Parent)

  • 结点的子树的根称为该结点的「孩子」(Child)
    • D为B的「孩子」
  • 该结点称为「孩子」的「双亲」(Parent)
    • B为D的「双亲」

 兄弟(Sibing)、堂兄弟(Cousins)

  • 同一个「双亲」的「孩子」之间互称为「兄弟」(Sibling)
    • B和C互为「兄弟」
  • 「双亲」在同一层的结点互称为「堂兄弟」
    • D和E互为「堂兄弟」

祖先(ancestor)、 子孙(descendant)

 

  • 结点的「祖先」(ancestor):从根到该结点所经分支上的所有结点
    • A、C 都是 F 的「祖先」(Ancestor)
    • F 是所有这些结点的「子孙」(Descendant)

结点的层次(Level)、树的深度(Depth)

  • 结点的层次从根开始定义,根为第一层,根的「孩子」为第二层
    • 若某结点在第 n 层,则其子树就在第 n + 1 层
  • 树中结点的最大层次称为树的深度或树的高度


有序树、无序树、森林(Forest)

  • 有序树:树中结点的各子树从左至右有次序
  • 无序树:树中结点的各子树无次序
  • 森林(Forest):是 m(m >= 0)棵互不相交的树的集合

  • 只有一棵树,是森林

  • 有两棵树,是森林

总结

  • 一棵树可以看成是一个特殊的森林
  • 给森林中的各子树加上一个「双亲」结点,森林就变成了树

线性结构和树结构的差异

线性结构树结构
第一个数据元素:无前驱根结点(只有一个):无双亲
最后一个数据元素:无后继叶结点(可以多个):无孩子
中间元素:一个前驱、一个后继中间结点:一个双亲、多个孩子
一对一一对多


二叉树(Binary Tree) 

二叉树特点

  • 每个结点最多有两棵子树(二叉树中不存在「度」大于2的结点)
  • 子树有左右之分,其次序不能颠倒
  • 二叉树可以是空集,根可以有空的左子树或空的右子树

二叉树不是「树」(的特殊情况)

  • 二叉树是树型结构,但「二叉树」是「树」是两种不同的数据结构
  • 二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要区分,说明它是左子树,还是右子树
  • 树当结点只有一个「孩子」时,就无须区分它和左还是右的次序。因此,二者不同

  • 二叉树每个结点位置或者说次序都是固定的,可以是空,但是不可以说它没有位置
  • 而树的结点位置是相对于别的结点来说的,没有别的结点时,它就无所谓左右了

 二叉树的5种基本形态


二叉树的性质

  • 在二叉树的第 i 层上最多有 2ⁱ⁻¹ 个结点(i >= 1),最少 1 个结点
  • 深度为 k 的二叉树最多有 2ᵏ - 1 个结点(k >= 1),最少 k 个结点
  • 对任何一棵二叉树,如果其终端结点数为 n₀,度为2的结点数为 n₂,则 n₀ = n + 1
  • 具有n个结点的完全二叉树的深度为[log₂n] + 1(高斯取整)
  • 如果对一棵有n个结点的完全二叉树的结点按层序编号,对任意结点i有:

    • 如果 i = 1,则i是二叉树的根,无双亲;如果 i > 1,则双亲为[i / 2]
    • 如果 2i > n,则结点i是叶子结点,否则其左孩子是结点 2i
    • 如果 2i + 1 > n,则结点i是叶子结点,否则其右孩子为 2i + 1

特殊二叉树 

斜树

  • 左斜树


  • 右斜树


满二叉树

  • 一棵深度为 k,且二叉树最多有 2ᵏ - 1 个结点的二叉树
  • 特点
    • 每一层上的结点数都是最大结点数,即每层都满
    • 叶子结点全在最底层


完全二叉树 

  • 对一棵具有 n 个结点的二叉树按层序编号,如果编号为 i(1 <= i <= n) 的结点与同样深度的满二叉树中编号为 i 的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树
  • 满二叉树一定是完全二叉树,完全二叉树不一定是满的
  • 特点
    • 叶子结点只能出现在最下两层
    • 最下层的叶子一定集中在左部连续位置
    • 倒数二层,若有叶子结点,一定都在右部连续位置
    • 如果结点度为1,则该结点只有左「孩子」,即不存在只有右子树的囚;
    • 同样结点数的二叉树,完全二叉树的深度最小
  • 完全二叉树


  • 非完全二叉树 

  • 树1,结点5没有左子树,却有右子树,使得按层序编号的第10个编号空挡了
  • 树2,结点3没有子树,使得6、7编号的位置空挡了

二叉树的抽象数据类型定义 

ADT Tree{
Data 
    树是由一个根结点和若干棵子树构成的。树中结点具有相同的数据类型及层次关系。
Operation
    InitTree(*T) :构造空树T
    DestroyTree(*T): 销毁树
    CreateTree(*T, definition):按definition中给出树的定义来构造树
    ClearTree(*T): 清空树
    TreeEmpty(*T): 空树返回true
    TreeDepth(*T): 返回T的深度
    Root(*T): 返回T的根结
    Value(T, cur_e): cur_e是树T中的一个结点,返回此结点的值
    Assign(T, cur-e, value): 给树T的结点cur_e赋值为value
    Parent(T, cur_e): 若cur_e不是根结点,则返回它的双亲
    LeftChild(T, cur_e): 若cur_e是树T的非叶结点,则返回它的最左孩子,否则返回空。
    RightSibling(T, cur_e): 若cur_e有右兄弟,则返回右兄弟,否则返回空。
    InsertChild(*T, *p, i, c):其中p指向树T的某个结点,i为所指结点p的度加上1,若非空树c与T不相交,操作结果为插入c为树T中p指向结点的第i棵子树。
    DeleteChild(*T, *p, i): 其中p为指向树T的某个结点,i为所指结点p的度,操作结果为删除T中P所指向结点的第i棵子树。
}endADT
 

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

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

相关文章

VAE中的“变分”什么

写在前面 VAE&#xff08;Variational Autoencoder&#xff09;&#xff0c;中文译为变分自编码器。其中AE&#xff08;Autoencoder&#xff09;很好理解。那“变分”指的是什么呢?—其实是“变分推断”。变分推断主要用在VAE的损失函数中&#xff0c;那变分推断是什么&#x…

C++ | Leetcode C++题解之第514题自由之路

题目&#xff1a; 题解&#xff1a; class Solution { public:int findRotateSteps(string ring, string key) {int n ring.size(), m key.size();vector<int> pos[26];for (int i 0; i < n; i) {pos[ring[i] - a].push_back(i);}vector<vector<int>>…

linux指令笔记

bash命令行讲解 lyt &#xff1a;是用户名 iZbp1i65rwtrfbmjetete2b2Z :这个是主机名 ~ &#xff1a;这个是当前目录 $ &#xff1a;这个是命令行提示符 每个指令都有不同的功能&#xff0c;大部分指令都可以带上选项来实现不同的效果。 一般指令和选项的格式&#xff1a;…

Linux 重启命令全解析:深入理解与应用指南

Linux 重启命令全解析&#xff1a;深入理解与应用指南 在 Linux 系统中&#xff0c;掌握正确的重启命令是确保系统稳定运行和进行必要维护的关键技能。本文将深入解析 Linux 中常见的重启命令&#xff0c;包括功能、用法、适用场景及注意事项。 一、reboot 命令 功能简介 re…

洛谷 P3130 [USACO15DEC] Counting Haybale P

原题链接 题目本质&#xff1a;线段树 感觉我对线段树稍有敏感&#xff0c;线段树一眼就看出来了&#xff0c;思路出来得也快&#xff0c;这道题也并不是很难。 解题思路&#xff1a; 这道题能看出来是线段树就基本成功一半了&#xff0c;区间修改区间查询&#xff0c;就基…

深入探索:深度学习在时间序列预测中的强大应用与实现

引言&#xff1a; 时间序列分析是数据科学和机器学习中一个重要的研究领域&#xff0c;广泛应用于金融市场、天气预报、能源管理、交通预测、健康监控等多个领域。时间序列数据具有顺序相关性&#xff0c;通常展示出时间上较强的依赖性&#xff0c;因此简单的传统回归模型往往…

使用微信免费的内容安全识别接口,UGC场景开发检测违规内容功能

大家好&#xff0c;我是小悟。 内容安全识别主要针对的是有UGC即用户生成内容的功能场景&#xff0c;通过结合内容安全的审核能力&#xff0c;应对文本、图片、音频内容类型下的敏感内容识别、涉黄内容识别、暴恐内容识别、辱骂内容识别等违规问题&#xff0c;可以提高审核效率…

【Docker大揭秘】

Docker 调试一天的血与泪的教训&#xff1a;设备条件&#xff1a;对应的build preparation相应的报错以及修改 作为记录 构建FASTLIO2启动docker获取镜像列出镜像运行containerdocker中实现宿主机与container中的文件互传 调试一天的血与泪的教训&#xff1a; 在DOCKER中跑通F…

ubuntu-开机黑屏问题快速解决方法

开机黑屏一般是由于显卡驱动出现问题导致。 快速解决方法&#xff1a; 通过ubuntu高级选项->recovery模式->resume->按esc即可进入recovery模式&#xff0c;进去后重装显卡驱动&#xff0c;重启即可解决。附加问题&#xff1a;ubuntu的默认显示管理器是gdm3,如果重…

海洋生物图像分割系统:算法改进策略

海洋生物图像分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DiverseBranchBlock&#xff06;yolov8-seg-C2f-Faster-EMA等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目…

PHP-FPM 性能配置优化

4 核 8 G 服务器大约可以开启 500 个 PHP-FPM&#xff0c;极限吞吐量在 580 qps &#xff08;Query Per Second 每秒查询数&#xff09;左右。 Nginx php-fpm 是怎么工作的&#xff1f; php-fpm 全称是 PHP FastCGI Process Manager 的简称&#xff0c;从名字可得知&#xff…

第十七周:机器学习

目录 摘要 Abstract 一、MCMC 1、马尔科夫链采样 step1 状态设定 step2 转移矩阵 step3 马尔科夫链的生成 step4 概率分布的估计 2、蒙特卡洛方法 step1 由一个分布产生随机变量 step2 用这些随机变量做实验 3、MCMC算法 4、参考文章 二、flow-based GAN 1、引…

【Linux网络】Linux网络基础入门:初识网络,理解网络协议

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux网络 &#x1f4d2;1. 计算机网络背景发展历程"协议" &#x1f4dc;2. 网络协…

UML外卖系统报告(包含具体需求分析)

1、系统背景 随着互联网技术的快速发展&#xff0c;外卖订餐服务逐渐成为人们生活中的一部分。传统的电话订餐方式面临诸多不便和限制&#xff0c;而基于互联网的外卖订餐系统则提供了更加便捷、快速和高效的订餐服务。这种系统通过将餐厅、顾客和配送人员连接起来&#xff0c…

Sentinel详解

参考博客&#xff1a; SpringCloud Sentinel集成到微服务项目中&#xff08;保姆级教程&#xff09; 什么是Sentinel Sentinel 是面向分布式服务架构的轻量级流量控制产品&#xff0c;主要以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务…

Vue学习记录之二十五 Vue3中Web Componets的使用

一、webcomponets介绍 在Vue 3中使用Web Components可以通过多种方式实现。Web Components是一组允许你创建可重用、封装良好的自定义元素的标准技术。它们包括Custom Elements、Shadow DOM、HTML Templates等。 Vue3 支持原生模式&#xff0c;可以让单个文件的js,css,html以h…

移植rv1106SDK的ipcweb到ubuntu

移植minilogger 在sdk中找到minilogger&#xff0c;复制到任意的文件夹&#xff0c;执行 cmake ./ make make install把minilogger 安装到系统 修改Makefile 在上次那个基础上&#xff0c;修改Makefile #* 这里原来要包含../Makefile.param&#xff0c;但含有sdk的很多参数…

w003基于Springboot的图书个性化推荐系统的设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Mysql(十) --- 用户权限和管理

文章目录 前言1. 应用场景2.用户2.1. 查看用户2.2. 创建用户2.2.1 语法2.2.2. 注意事项 2.2.3.示例2.3. 修改密码2.3.1. 语法2.3.2. 示例 2.4.删除用户2.4.1.语法2.4.2.示例 3. 权限和授权MySQL内置支持的权限列表3.1.给用户授权3.1.1.语法3.1.2. 示例 3.2.回收权限3.2.1.语法3…

Golang Agent 可观测性的全面升级与新特性介绍

作者&#xff1a;张海彬&#xff08;古琦&#xff09; 背景 自 2024 年 6 月 26 日&#xff0c;ARMS 发布了针对 Golang 应用的可观测性监控功能以来&#xff0c;阿里云 ARMS 团队与程序语言与编译器团队一直致力于不断优化和提升该系统的各项功能&#xff0c;旨在为开发者提…