第四章 树和二叉树

news2024/11/16 12:43:26

第四章 树和二叉树

  • 树的基本概念
    • 树的概念
    • 树的相关术语
  • 二叉树
    • 二叉树基本概念
    • 二叉树的性质
  • 二叉树的存储结构
    • 二叉树的顺序存储结构
    • 二叉树的链式存储结构
  • 二叉树的遍历
    • 二叉树遍历的递归实现
    • 二叉树的层次遍历
    • 二叉树遍历的非递归实现
  • 树和森林
    • 树的存储结构
    • 树、森林与二叉树的关系
    • 树和森林的遍历
  • 判定树和哈夫曼树
    • 分类与判定树
    • 哈夫曼树和哈夫曼算法
    • 哈夫曼编码
  • 牛刀小试

树的基本概念

  • 树形结构中一个结点可以有一个或多个直接后继

在这里插入图片描述

树的概念

  • 树是n(n>=0)个结点的有限集合,一棵树满足以下两个条件:
    • 当n=0时,称为空树
    • 当n>0时,有且仅有一个称为根的结点,除根结点外 ,其余结点分为m(m>=0)个互不相交的非空集合,这些非空集合中的每一个都是一颗树,称为根的子树
  • 森林:m个互不相交的树的集合。删除一个非空树的根结点,它的子树便构成森林

树的相关术语

  • 结点的度:树上任何一个结点所拥有的子树数目称为该结点的度
  • 叶子:度为0的结点称为叶子或终端结点
  • 树的度:一棵树中所有结点的度的最大值称为该树的度
  • 一个结点的子树的根称为该结点的孩子(或称子结点),相应该结点称为孩子的双亲父结点
  • 结点的层次:从根开始算起,根为1,其余结点层次为其双亲的层次+1
  • 树的高度:一棵树中所有结点层次数的最大值
  • 有序树:各节点子树从左到右是有次序的,不能互换
  • 无序树:各结点的子树是无次序的,可以互换,称为无序树
  • 树的基本运算
    • 求根
    • 求双亲
    • 求孩子
    • 建树
    • 剪枝
    • 遍历

二叉树

二叉树基本概念

  • 二叉树:n(n>=0)个元素的有限集合,该集合或为空,或由一根及两根互不相交的左子树和右子树组成
  • 二叉树五种基本形态:

在这里插入图片描述

  • 二叉树基本运算:
    • 初始化:建立一棵空二叉树
    • 求双亲:求出二叉树上结点XX的双亲结点
    • 求左孩子Lchild(BT,X)和求右孩子Rchild(BT,X)
    • 建二叉树
    • 先序遍历:先访问根节点,然后递归地访问左子树,最后递归地访问右子树。(根-左-右)
    • 中序遍历 :先递归地访问左子树,然后访问根节点,最后递归地访问右子树。(左-根-右)
    • 后序遍历:先递归地访问左子树,然后递归地访问右子树,最后访问根节点。(左-右-根)
    • 层次遍历:从上到下逐层遍历二叉树的节点。

二叉树的性质

  • 二叉树第i(i>=1)曾上至多有2i-1个结点
  • 深度为k(k>=1)的二叉树至多有2k-1个结点
  • 对于任何一颗二叉树,若度数为0的结点个数为n0,度数为2的结点个数为n2,则n0=n2+!

注:深度为k(k>=1)且有2k-1个结点的二叉树称为满二叉树;完全二叉树:对满二叉树从上到下,从左到右顺序编号,并在最下层删除部分结点,如果删除的这些结点的编号是连续的且删除的结点中含有最大编号的结点,那么这棵二叉树是完全二叉树

在这里插入图片描述

  • 含有n个结点的完全二叉树的深度为⌊log2n⌋+1(⌊⌋符号表示向下取整)
  • 如果将一棵有n个结点的完全二叉树按层编号,将一棵二叉树的所有n个结点按从第一层到最大层,每层从左到右依次编号,则对任一编号为i(1<=i<=n)的结点A有:
    • 若i=1,则结点A是根;若i>1,则A的双亲Parent(A)的编号为⌊i/2⌋
    • 若2i>n,则结点A既无左孩子,也无右孩子;否则A的左孩子Lchild(A)的编号为2i+1
    • 若2i+1>n,则结点A无右孩子;否则,A的右孩子Rchild(A)的编号为2i+1

二叉树的存储结构

二叉树的顺序存储结构

  • 二叉树的 顺序存储结构可以用一维数组来实现

在这里插入图片描述
在这里插入图片描述

二叉树的链式存储结构

  • 二叉树有不同的链式存储结构,最常用的是二叉链表与三叉链表

在这里插入图片描述

二叉树的遍历

二叉树遍历的递归实现

  • 先序遍历
    • 访问根结点
    • 先序遍历左子树
    • 先序遍历右子树
  • 中序遍历
    • 中序遍历左子树
    • 访问根结点
    • 中序遍历右子树
  • 后序遍历
    • 后序遍历左子树
    • 后序遍历右子树
    • 访问根结点

二叉树的层次遍历

  • 所谓二叉树层次遍历,是指从树的根结点开始逐层向下从左到右逐个访问

在这里插入图片描述
层次遍历的序列为ABCDEF

二叉树遍历的非递归实现

在这里插入图片描述

树和森林

树的存储结构

  • 孩子链表表示法:一个数组元素个数和树中结点个数相同的一维数组

在这里插入图片描述
带双亲的孩子链表表示法如下:
在这里插入图片描述

  • 孩子兄弟链表表示法

在这里插入图片描述
在这里插入图片描述

  • 双亲表示法(一维数组构成,每个分量包含数据域和双亲域)

在这里插入图片描述

树、森林与二叉树的关系

  • 树转换为二叉树
    • 将所有兄弟结点连接起来
    • 保留第一个兄弟结点与父结点的连接,断开其他兄弟结点与父结点的连接,然后以根结点为轴心按顺时针的方向旋转45度

在这里插入图片描述

  • 森林转换为二叉树
    • 将每棵树转换成相应的二叉树
    • 将前一步中得到的各颗二叉树的根结点看作是兄弟连接起来

在这里插入图片描述

  • 二叉树转为森林
    • 在待转换的二叉树中,断开根结点与右孩子的连线,得到两棵二叉树
    • 二叉树B1中A连接C、D,断开BC、BD的连线
    • 重复前两步

在这里插入图片描述

树和森林的遍历

  • 树的遍历
    • 先序遍历:若树非空,访问根结点,依次先序遍历根的各棵子树
    • 后序遍历:依次后序遍历根的各棵子树,访问根结点
    • 层次遍历:若树非空,访问根结点;若i(i>=1)层结点已被访问,第i+1层结点尚未访问,则从左到右依次访问第i+1层结点
  • 森林(非空)的遍历
    • 先序遍历森林;访问第一棵树的根结点;先序遍历第一棵树的根结点的子树组成的森林;先序遍历除去第一棵树之外其余树组成的森林
    • 中序遍历森林:中序遍历森林中第一棵树的根结点的子树组成的森林;访问第一棵树的根结点;中序遍历除去第一棵树之外其余树组成的森林

判定树和哈夫曼树

分类与判定树

  • 分类是树的一种应用,其作用是将输入数据按预定的标准划分为不同的种类

在这里插入图片描述

哈夫曼树和哈夫曼算法

哈夫曼树:当用 n 个结点(都做叶结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度(WPL)最小

  • 权:树结点间的连线相关的数值(可以理解成线的长度,或者孩子的权重)叫做权
  • 树的带权路径长度(WPL,Weighted Path Length):树中所有叶结点的带权路径长度之和;WPL的值越小,说明构造出来的二叉树的性能就越优

在这里插入图片描述
在这里插入图片描述

哈夫曼编码

牛刀小试

  • 高度为K(K>=2)的完全二叉树至少有_____个叶子结点
  • 一棵二叉树的先序序列和中序序列正好相反的充分必要条件是_______
  • 深度为6(根层次为1)的二叉树至多有_______结点
  • 已知二叉树的先序遍历序列为ABCFHIDGJE,中序遍历序列为AHIFCJGDEB,其后序遍历序列为_______
  • 以数据集{4,7,9,11,16,23,30}为叶结点的权值,构建一棵哈夫曼树,并给出哈夫曼编码

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

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

相关文章

【低代码开发】:低代码开发助力应用创新

低代码开发&#xff1a;加速应用开发的未来趋势 引言什么是低代码以及功能特点&#xff1f;什么是低代码开发&#xff1f;低代码平台的特点和功能低代码平台的应用场景和优势低代码的优点低代码的缺点低代码平台项目开发流程选择和实施低代码平台 低代码未来的发展趋势低代码平…

Java基础(变量篇)

变量是Java程序中基本的存储单元&#xff0c;变量名有三个基本要素&#xff1a;数据类型、变量名和值。变量名是一块内存单元的名称&#xff0c;就像门牌号一样&#xff0c;通过变量可以找到它表示的内存单元&#xff0c;并对这块内存单元进行操作。在Java中变量必须声明后使用…

英国/法国/意大利/德国/西班牙,电动交通设备配件等相关政策更新

产品安全 合规政策更新&#xff01; 首先请看邮件内容 尊敬的卖家&#xff1a; 您好&#xff01; 我们此次联系您是因为您正在销售需要审批流程的商品。为此&#xff0c;亚马逊正在实施审批流程&#xff0c;以确认我们网站上提供的商品类型须符合指定的认证标准。要在亚马逊…

Cesium小技巧:快速打开API文档

学习Cesium.js的人&#xff0c;肯定经常看官方示例&#xff0c; 网址如下&#xff1a; https://sandcastle.cesium.com/ 有个小技巧&#xff0c;可以快速打开具体类的API文档 在示例中&#xff0c;双击具体类名或方法名&#xff0c;会出现一个提示框 单击或右键菜单-在新标…

Linux系统编程:Linux基础

Linux基本使用 安装 这就不说了网上很多教程&#xff0c;随便一个Linux版本都可以&#xff0c;因为命令都差不多。 检查是否有网络 检查网络有以下几个推测方法&#xff0c;如果没有网络的话就按照这几个可能出现问题的地方对症下药寻找解决办法即可&#xff1a; ctrl al…

蓝桥杯基础---切面条

切面条 一根高筋拉面&#xff0c;中间切一刀&#xff0c;可以得到2根面条。 如果先对折1次&#xff0c;中间切一刀&#xff0c;可以得到3根面条。 如果连续对折2次&#xff0c;中间切一刀&#xff0c;可以得到5根面条。 那么&#xff0c;连续对折10次&#xff0c;中间切一刀…

MySQL数据库安装和介绍

一.数据库的介绍 1.1.MySQL数据库是什么&#xff1f; 一款深受欢迎的开源关系型数据库&#xff0c;Oracle旗下的产品&#xff0c;遵守GPL协议&#xff0c;可以免费使用与修改。 官网&#xff1a;MySQL 特点&#xff1a; 性能卓越、服务稳定 开源、无版权限制、成本低 …

优雅而高效的JavaScript——函数柯里化

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;优雅而高效的JavaScript——函数柯里化 文章目录 前言函数柯里化的概念和原理介绍函数柯里化的优点和应用场景函数柯里化的具体实现方式和实例分析函数柯里化在实际项目中的应用函数柯里化与函数式编…

数据结构:链表(1)

顺序表的优缺点 缺点&#xff1a; 1.插入数据必须移动其他数据&#xff0c;最坏情况下&#xff0c;就是插入到0位置。时间复杂度O(N) 2.删除数据必须移动其他数据&#xff0c;最坏情况下&#xff0c;就是删除0位置。时间复杂度O(N) 3.扩容之后&#xff0c;有可能会浪费空间…

Python并发编程简介

1、Python对并发编程的支持 多线程: threading, 利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成多进程: multiprocessing, 利用多核CPU的能力&#xff0c;真正的并行执行任务异步IO: asyncio,在单线程利用CPU和IO同时执行的原理&#xff0c;实现函数异步执行使用Lo…

C++程序员必修第一课【C++基础课程】00:课程介绍

1 课程目标&#xff1a; 搭建 VC 2019 开发环境全面系统学习 C 语法和开发基础学会用代码思维解决实际工作中的问题拥有一定的程序设计能力&#xff0c;能够开发一个完整软件 2 适用人群&#xff1a; 【零基础&#xff0c;想入行 C 程序员&#xff0c;必修第一课程】学生&am…

公众号留言板小程序哪个好用?一一列举

为什么公众号没有留言功能&#xff1f;2018年2月12日之后直到现在&#xff0c;新注册公众号的运营者会发现一个问题&#xff1a;无论是个人还是企业的公众号&#xff0c;在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验&#xff0c;少了一个这么重要的功能&…

【java学习】对象的产生(18)

文章目录 1. 初始化赋值2. 匿名对象3. 练习3.1. 习题一3.2. 习题二 4. 总结 1. 初始化赋值 当一个对象被创建时&#xff0c;会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型&#xff0c;如上节的 Person 和前面讲过的数组。 成员…

C# 搭建一个简单的WebApi项目23.10.10

一、创建Web API 1、创建一个新的web API项目 启动VS 2019&#xff0c;并在“开始页”选择“创建新项目”。或从“文件”菜单选择“新建”&#xff0c;然后选择“项目”。 选择ASP.NET Web应用程序(.NET Framework) 2.点击下一步&#xff0c;到这个页面时选择Web API。 3.选中…

类加载器、双亲委派机制

目录 1 JVM是什么2 类加载系统2.1 类的加载过程2.2 类加载器 3 双亲委派机制3.1 双亲委派机制介绍3.2 双亲委派机制的优缺点3.3 自定义类加载器实现双亲委派机制 1 JVM是什么 Java Virtual Machine&#xff08;Java虚拟机&#xff09;是java程序实现跨平台的⼀个重要的⼯具&am…

python查找替换:查找空行,空行前后添加```,```中间添加 # + 空格 + 空行后遇到的第1行文字?

初始代码 查找空行空行前后添加 中间添加 # 空行后遇到的第1行文字txt 36 96 159 8 72可以使用Python的字符串处理函数来查找并修改文本中的空行。以下是一个示例代码&#xff0c;演示如何在文本中查找空行&#xff0c;并在每个空行前后添加和一个注释&#xff1a; # 原始文本…

销售活动管理必备工具——CRM系统软件

在企业业务中&#xff0c;销售活动是实现企业业绩目标的基本单元&#xff0c;起着奠基石的作用。CRM销售管理系统是销售活动管理的必备工具&#xff0c;帮助企业更好地开展销售活动。下面来说说CRM系统如何找到并输出关键销售活动&#xff1f; 在能顺利找到并输出关键销售活动…

选刊CFP | 中科院1区TOP,IF18.6,Elsevier出版社,仅3个月录用!

【SciencePub学术】 本期推荐 部分学者论文完成后&#xff0c;选刊上犯难&#xff0c;面对纷繁复杂的期刊信息及流程&#xff0c;很难有时间和精力一一调研查看&#xff0c;小编在也经常收到此类信息&#xff0c;希望我们帮助查询期刊信息。为此&#xff0c;小编开设此专栏【选…

leetcode:455. 分发饼干(python3解法)

难度&#xff1a;简单 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff…

超详细!主流大语言模型的技术原理细节汇总!

1.比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节&#xff1a;tokenizer、位置编码、Layer Normalization、激活函数等。 2. 大语言模型的分布式训练技术&#xff1a;数据并行、张量模型并行、流水线并行、3D 并行、零冗余优化器 ZeRO、CPU 卸载技术 ZeRo-offload、混合精度训…