数据结构【树】

第五章 树

一、树
1.定义:n个结点的集合,n=0为空树;是递归的,是一种逻辑结构,同时也是一种分层结构;

  • 特点
    • 树的根结点没有前驱结点,除了根结点外的所有结点有且只有一个前驱结点;
    • 树的所有结点可以有0个或者多个后继结点;
    • 树适合于表达具有层次结构的数据;
    • 除根结点外,分支结点又叫内部结点。

2.树的术语

  • 结点:一个数据元素及其若干指向其子树的分支;如图中有17个结点;
  • 结点的度、树的度:结点所拥有的子树棵数称为结点的度;树中结点度的最大值称为树的度;如图中A的度是3、B是2、Q是0;
    在这里插入图片描述
  • 叶子结点:度为0(不为0的是非叶子结点);
  • 孩子结点、双亲结点、兄弟结点点、(层次)堂兄弟结点(像族谱);
    • 同一双亲结点的所有子结点互称为兄弟结点;
    • 同一层次的所有结点互称为堂兄弟结点(其子结点在+1层);
  • 结点的层次路径、祖先、子孙
    • 层次路径:从根结点到达某结点(例如p点)所经过的所有结点成为结点(p)的层次路径(有且只有一条);
    • 结点(p)的层次路径上所有的结点(不包括p)都称为p的祖先;
    • 以某结点为根的子树中任意结点都是该根结点的子孙结点。
  • 结点的深度:从根结点,自顶向下逐层累加;
  • 结点的高度:从叶节点,自底向上逐层累加;
  • 有序树和无序树:顾名思义,有序和无序之分;
  • 森林:类似于把树的根结点去除,剩下的子树便成了深林。

3.树的性质:

  • 树中的结点数等于所有结点的度数和加1;
  • 度为m的树中第i层上至多有 mⁱ⁻¹个结点(i≥1);
  • 高度为h的m叉树至多有 mʰ-1/m-1个结点,例如二叉树最多为二个分支;
  • 具有n个结点的m叉树的最小高度为 logₘ(n(m-1)+1;

二、二叉树
1.定义:另外一种树形结构,每个结点最多只有两棵子树(不存在度大于2的结点),且子树有左右之分,次序不可随意颠倒;二叉树是n个结点的有限集合,n=0为空树;

  • 有且只有一个根结点;
  • n>1时,其余结点被分为两互不相交的子集,也是递归的;

2.满二叉树:深度为k,且有2ᵏ-1个结点;

  • 特点
    • 每层都是最大结点数;
    • 所有支结点都有左右子树;
    • 可以对结点进行编号,自上而下,自左而右。

3.平衡二叉树:树上任意一结点的左子树和右子树的深度之差不超过1。
4.完全二叉树:简单来说,与满二叉树的结构不同就在于,完全二叉树可以不满;也就是说完全二叉树是满二叉树的一部分,而满二叉树是完全二叉树的特例;

  • 特点
    • 若完全二叉树的深度为k,则所有的叶子结点都出现在第k层或k-1层。对于任一结点,如果其右子树的最大层次为l,则其左子树的最大层次为或l+1;
    • 若i<=|n/2|,则结点i为分支结点,否则为叶子结点;
    • 叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层的最左边的位置;
    • 如果有度为1的结点,只可能有一个,且该结点只有左孩子而无右孩子;
    • 按层序编号后,一旦出现某结点(其编号为i)为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点。

5.二叉树的性质

  • 在非空二叉树中,第i层上至多有2ⁱ-1个结点(i≧1); 深度为k的二叉树至多有2ᵏ-1个结点(k≧1);
  • ▲[mark]对任何一棵二叉树,若其叶子结点数为n₀,度为2的结点数为n₀,则n₀=n₂+1;[/mark]
  • n个结点的完全二叉树深度为:(向下取整log₂n)+1或向上取整log₂(n+1);例如3.5向上取整是4,向下取整是3。

6.二叉树的存储

  • 顺序存储:完全二叉树和满二叉树比较适合这个方法;

    • 最坏情况:深度为k且只有k个结点的单支树需要的长度为2ᵏ-1的一维数组;在这里插入图片描述
  • 链式存储

    • 二叉链表:三个域:一个数据域,分别指向左右子结点的指针域;
    • 三叉链表:在二叉链表基础上再加一个指针域,用来指向结点的父结点;

7.遍历二叉树:按一定规律对二叉树每个结点访问一次且仅访问一次;

  • 方法▲
  • DLR——先(根)序遍历:根左右,时间复杂度O(n);
  • LDR——中(根)序遍历:左根右,时间复杂度O(n);
  • LRD——后(根)序遍历:左右根,时间复杂度O(n);
  • 层次遍历:需要借助一个队列:自上而下,从左到右。
    在这里插入图片描述

三、树与森林
1.树的存储结构

  • 双亲表示法(顺序存储结构):在每个结点中附加一个指示器(整数域);
    在这里插入图片描述
    在这里插入图片描述
  • 孩子链表表示法:每个结点有多个指针域,每个指针指向其一棵子树的根结点;
    在这里插入图片描述
    2.森林与二叉树的转换
  • 树转成二叉树
    • 步骤:
      • 加虚线:兄弟间加虚线;
      • 去连线:除最左的第一个结点外的父结点与其点的连线全部去掉;
      • 旋转:顺时针旋转45°,原有的实线左斜;
      • 整型:将旋转后树中的虚线改为实线并向右斜。
    • 特点:无右子树,只有左子树。
  • 二叉树转成树
    • 步骤
      • 加虚线:若某结点i是其父结点的左子树的根结点,则将该结点i的右子结点以及沿右子链不断地搜索所有的右子结点,将所有这些右子结点与i结点的父结点之间加虚线相连;
      • 去连线:去掉二叉树中所有父结点与其右子结点之间的连线;
      • 规整化。将各结点按层次排列且将所有的虚线变成实线。
        在这里插入图片描述
        在这里插入图片描述
  • 森林转二叉树:相当于树转二叉树;
    在这里插入图片描述
  • 二叉树转森林:相当于二叉树转树;
    在这里插入图片描述

3.树和森林的遍历(看树和森林的遍历与二叉树遍历的关系就懂了);
在这里插入图片描述

四、树的应用(赫夫曼树、最优树)
1.基本概念:是一类带权路径长度最短的树;

  • 结点路径:树中结点到结点的路径;
  • 路径长度:看有多少个分支;
  • 树的路径长度:树根到每个结点的和;
    结点的带权路径长度:权值乘以从该结点到树根结点之间的路径长度;
    树的带权路径长度:树中所有叶子结点的带权路径的长度之和。

2.哈夫曼树算WPL值
在这里插入图片描述

3.哈夫曼树的构造(最优树)
在这里插入图片描述

4.哈夫曼编码(Huffman)

  • 特点:编码要尽可能短,长短不等,任意字符的编码不是另一个编码的前缀(前缀编码);

5.例题:一棵度为2的树与一棵二叉树有什么区别?
答案:
1、度为2的树是不区分左子树和右子树.而二叉树是要分左子树和右子树的;
2、度为2的数不包含空树,而二叉树是可以有空树的;总之,二叉树的定义要比度为2的树定义更为严格,更为详细。

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

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

相关文章

Clion开发STM32之W5500系列(综合实验)

说明 此为w5500模块的综合实验测试模块,包含dhcp、dns、ntp以上三个模块的驱动参考之前的文章&#xff0c;本篇不做说明.使用的开发芯片 stm32f103vet6系列,外设接口使用的spi2 实验内容: 通过dhcp动态获取ip,通过dns解析NTP服务域名的ip通过NTP服务ip获取时间 w5500配置驱…

学生护眼台灯几瓦最舒适?2023全新五款护眼台灯推荐

每次经过学校&#xff0c;发现戴眼镜的小学生真的不少&#xff0c;通过近几年的儿童以及青少年的近视人数可看出&#xff0c;我国的近视人数中&#xff0c;儿童以及青少年占比53.5%&#xff0c;所以许多家长逐渐重视孩子用眼健康问题&#xff0c;会选择护眼台灯用于孩子写作业和…

第1章 获取数据库中的数据

CoreShop源程序是以数据库优先进行定义的&#xff0c;所以其本身不包含代码优先的定义&#xff0c;但本从更习惯于代码优先&#xff0c;所以为其定义了代码优先的定义。 1 CoreCms.Net.Model.Entities.SysRole using SqlSugar; using System.ComponentModel.DataAnnotations…

【JavaEE初阶】Tomcat安装与使用及初识Servlet

文章目录 1. Tomcat的安装与使用1.1 Tomcat安装1.2 Tomcat的启动1.3 Tomcat部署前端页面 2. Servlet2.1 Servlet是什么2.2 第一个Servlet程序2.3 常见错误 1. Tomcat的安装与使用 1.1 Tomcat安装 在浏览器中搜索Tomcat,打开官方网页.Tomcat官网 点击下载Tomcat8. 点击下载压…

PSP - 使用 MMseqs2 工具快速搜索蛋白质序列数据库 (GMGC)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131934642 MMseq2 是非常强大和高效的生物信息学软件&#xff0c;可以在极短的时间内对大规模的核苷酸和蛋白质序列进行搜索和聚类。主要特点有&a…

fpga_pwm呼吸灯(EP4CE6F17C8)

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

c++网络编程:Boost.asio源码剖析

1、前言 Boost库是一个可移植、提供源代码的C库&#xff0c;作为标准库的后备&#xff0c;是C标准化进程的开发引擎之一。Boost库由C标准委员会库工作组成员发起&#xff0c;其中有些内容有望成为下一代C标准库内容。在C社区中影响甚大&#xff0c;是不折不扣的“准”标准库。…

未来行星探索希望:新型多脚机器人-团队版

机器人正在探索一个模拟的外星环境 即使一个机器人失败了&#xff0c;其余的团队成员也可以抵消它的损失。 背景 虽然探测器取得了令人难以置信的发现&#xff0c;但它们的轮子可能会拖慢它们的速度&#xff0c;而不稳定的地形可能会导致损坏。虽然没有东西可以取代“毅力号”…

Vue3输入框(Input)

APIs 参数说明类型默认值必传width输入框宽度string | number‘100%’falseaddonBefore设置前置标签string | slot‘’falseaddonAfter设置后置标签string | slot‘’falseallowClear可以点击清除图标删除内容booleanfalsefalsepassword是否启用密码框booleanfalsefalsedisabl…

两个小封装电机驱动芯片:MLX813XX、A4950

一&#xff0e;MLX813XX MELEXIS的微型电机驱动MLX813XX系列芯片集成MCU、预驱动以及功率模块等能够满足10W以下的电机驱动。 相对于普通分离器件的解决方案&#xff0c;MLX813XX系列电机驱动芯片是一款高集成度的驱动控制芯片&#xff0c;可以满足汽车系统高品质和低成本的要…

Spring Boot实践一

一、Spring Boot简介 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、方便的方式来创建基于Spring的应用程序&#xff0c;而无需繁琐的配置。Spring Boot通过自动配置和约定大于配置的方式&#xff0c;使得开发者可以更加专注于业务逻辑的实现&…

【CEEMDAN-WOA-LSTM】完备集合经验模态分解-鲸鱼优化-长短时记忆神经网络研究(Python代码实现)

目录 &#x1f4a5;1 概述 1.1 完备集合经验模态分解原理 1.2 鲸鱼优化 1.3 LSTM &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Python代码实现 &#x1f4a5;1 概述 1.1 完备集合经验模态分解原理 早期的 EMD 方法具有较强的自适应性&#xff0c;能够有…

【node.js】03-http模块

目录 一、什么是http模块 二、创建基本的WEB服务器 三、req请求对象 四、res响应对象 五、根据不同的url响应不同的JSON内容 一、什么是http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法&#xff0c;…

深度学习推理和训练

优化和泛化 深度学习的根本问题是优化和泛化之间的对立。 • 优化&#xff08;optimization&#xff09;是指调节模型以在 训练数据 上得到最佳性能&#xff08;即机器学习中的学习&#xff09;。 • 泛化&#xff08;generalization&#xff09;是指训练好的模型在 前所未…

Java的0xFFFF在赋值、比较时引起的困惑

Java中的0xFFFF是整型&#xff0c;在赋值、比较的时候容易引起混淆&#xff0c;涉及到符号位、数值大小&#xff0c;赋值给什么类型的变量。我今天在编码的时候就遇到了一些困惑。用代码样例的形式记录下来&#xff0c;加深理解&#xff1a; package com.thb;public class Tes…

RT-Thread快速入门-定时器管理

1时钟节拍 任何操作系统都需要提供一个时钟节拍&#xff0c;以供系统处理所有和时间有关的事件&#xff0c;如延时、线程的时间片轮转调度以及定时器超时等。时钟节拍&#xff08;OS Tick&#xff09;是操作系统中最小的时间单位。 时钟节拍是特定的周期性中断&#xff0c;这…

vue预览和下载txt、PDF、execl等在线文件

因为浏览器默认能直接打开TXT、PDF等文件索引默认就是点击链接打开文件。但是浏览器却又不能在线打开execl、world等文件。 现在我们可以统一的实现文件的预览以及下载。 下载文件 downloadfile方法 downloadfile(url,fileName){const newUrl url;const x new XMLHttpRequ…

【vue3】vue3的一般项目结构、成功显示自己的vue3页面

一、vue3的一般项目结构 Vue 3并没有规定特定的项目结构&#xff0c;因此您可以根据项目的需求和个人偏好来组织您的Vue 3项目。以下是一个常见的Vue 3项目结构示例&#xff0c;供参考&#xff1a; your-project/|- public/| |- index.html # 应用程序的入口HTML文件…

智慧井盖监测管理系统解决方案

一、方案概述 近年来&#xff0c;随着城市化的不断发展&#xff0c;城市地下管道设施的一步步完善&#xff0c;井盖作为城市基础设施中必不可少的一部分&#xff0c;其重要性也逐渐凸显。然而&#xff0c;在实际应用中&#xff0c;井盖监测和管理并不容易。如井盖地理位置分散&…

第一百一十四天学习记录:C++提高:类模板案例(黑马教学视频)

类模板案例 main.cpp代码&#xff1a; #include "myarray.hpp"void printIntArray(MyArray <int>& arr) {for (int i 0; i < arr.getSize(); i){cout << arr[i] << " ";}cout << endl; }void test01() {MyArray <int&…