数据结构详细笔记——树

文章目录

    • 树的定义和基本术语
      • 结点、树的属性描述
      • 有序树与无序树
      • 树与森林
    • 树的常考性质
    • 树的存储结构
      • 双亲表示法(顺序存储)
      • 孩子表示法(顺序+链式存储)
      • 孩子兄弟表示法(链式存储)
    • 树和森林的遍历
      • 树的遍历
      • 森林的遍历
    • 哈夫曼树
      • 哈夫曼树的基础术语
      • 哈夫曼树的定义
      • 哈夫曼树的构造


树的定义和基本术语

树是n(n>=0)个结点的有限集合,n=0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足:
1、有且仅有一个特定的称为根的结点
2、当n>1时,其余结点可分为m(m>0)个互不相交的有限集合,其中每一个集合本身又是一棵树,并且称为根结点的子树。

结点、树的属性描述

1、结点的层次(深度)————从上往下数
2、结点的高度————从下往上数
3、树的高度(深度)————总共多少层
4、结点的度————有几个孩子(分支)
5、树的度————各结点的度的最大值

有序树与无序树

有序树——逻辑上看,树中结点的各子树从左至右是有次序的,不能互换
无序树——逻辑上看,树中结点的各子树从左至右是无次序的,可以互换
注意:具体看你的树存什么,是否需要用结点的左右位置反映某些逻辑关系

树与森林

森林——森林是m(m>=0)棵互不相交的树的集合
m可为0:空森林

树的常考性质

1、结点数 = 总度数 + 1

2、度为m的树、m叉树的区别

树的度————各结点的度的最大值
m叉树————每个结点最多只能有m个孩子的树

度为m的树m叉树
任意结点的度 <= m (最多m个孩子)任意结点的度 <= m(最多m个孩子)
至少有一个结点度 = m (有m个孩子)允许所有结点的度都 < m
一定是非空树,至少有m+1个结点可以是空树

3、度为 m 的树第 i 层至多有 mⁱ⁻¹ 个结点(i >= 1)

4、高度为 n 的 m 叉树至多有 mⁿ - 1/m-1 个结点

5、高度为 h 的 m 叉树至少有 h 个结点。 高度为 h、度为 m 的树至少有 h+m-1 个结点

6、具有 n 个结点的 m 叉树的最小高度为 在这里插入图片描述

树的存储结构

双亲表示法(顺序存储)

每一个结点中保存指向双亲的“指针”

#define MAX_REE_SIZE 100
typedef struct{       // 树结点定义 ElemType data;    // 数据元素int parent;       // 双亲位置域
} PTNode;
typedef struct{       // 树的类型定义PTNode nodes[MAX_REE_SIZE];  // 双亲表示 int n;            // 结点数
}PTree;

注意:根节点固定存储在0,-1 表示没有双亲

优点:查指定结点的双亲很方便
缺点:查指定结点的孩子只能从头遍历

孩子表示法(顺序+链式存储)

顺序存储各个结点,每个结点中保存孩子链表头指针

struct CTNode{int child;  // 孩子结点在数组中的位置struct CTNode *next;  // 下一个孩子
}
typedef struct{ElemType data;struct CTNode *firstChild; // 第一个孩子
}CTBox;
typedef struct{CTBox nodes[MAX_REE_SIZE];int n,r;   // 结点数和根的位置
}CTree;

孩子兄弟表示法(链式存储)

typedef struct CSNode{ElemType data;struct CSNode *firstChild,*nextsibling;  // 第一个孩子和右兄弟指针
}CSNode,*CSTree;

该方法相当于树和二叉树的转化(下一篇博客会讲到二叉树)
在这里插入图片描述

树和森林的遍历

树的遍历

1、先根遍历:若树非空,先访问根结点,再依次对每棵子树进行先根遍历

如上图的树:
A	 B		  	 C	    D
A	(B	E	F)  (C G)  (D H I J)
A   (B (EK) F)  (C G)  (D H I J)得先根遍历结果为 ABEKFCGDHIJ

2、后根遍历:若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点
3、层序遍历:用队列实现。①若树非空,则根结点入队。②若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队。③重复②直到队列为空

树的后根遍历序列与这棵树相应二叉树的中序序列相同

森林的遍历

1、先根遍历:等同于依次对各个树进行先根遍历
2、中序遍历:等同于依次对各个树进行后根遍历,也等同于对对应的二叉树进行中序遍历

哈夫曼树

哈夫曼树的基础术语

结点的:有某种现实含义的数值(如:表示结点的重要性等)
结点的带权路径长度:从树的根到该 结点的路径长度(经过的边数)该结点上的权值乘积
树的带权路径长度:树中所有 叶子结点的带权路径 长度之和(WPL)

哈夫曼树的定义

在含有n个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称为最优二叉树

哈夫曼树的构造

给定n个权值分别为 W1,W2,W3…Wn的结点,构造哈夫曼树的算法描述如下:
1、将这n个结点分别作为n棵仅含一个结点的二叉树,构造成森林F
2、构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且新结点的权值为左、右子树上根结点之和
3、从F中删除刚才选出的两棵树,同时将新得到的树加入F中
4、重复2、3步骤,直至F中只剩下一棵树为止

特点:
①每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大
②哈夫曼树的结点总数为2n-1
③哈夫曼树中不存在度为1的结点
④哈夫曼树并不唯一,但WPL必然相同且最优

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

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

相关文章

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅱ—— 创建和添加证书模板

目录 博文摘要3. 使用 Microsoft 证书颁发机构创建 Machine SSL 和 Solution User 证书模板3.1 打开 Certificate Template Console3.2 复制模板3.3 修改 Compatibility 选项卡3.4 修改 General 选项卡3.5 修改 Extensions 选项卡3.6 修改 Subject Name 选项卡3.7 确认新模板 4…

如何开发一个 Safari 插件

本文字数&#xff1a;2493字 预计阅读时间&#xff1a;15分钟 由于常用浏览器是Safari&#xff0c;而Safari浏览器的插件比不上Chrome&#xff0c;所以就有了自己开发常用的Safari插件的想法。 打算开发当前页面生成二维码的Extension&#xff0c;因为网络原因&#xff0c;AirD…

【milkv】internal codec -- mic

文章目录 一、硬件二、dts三、配置引脚board_initpin 四、makefile五、config六、添加tinyalsa七、测试结果7.1 查看录制device信息7.2 录制音频7.3 pc端获取录制好的设备7.4 使用audacity查看波形 一、硬件 i2s0 —— adc i2s1 —— pdm i2s3 —— dace spk_en存疑 i2s2 ——…

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiLSTM-…

rust学习——引用与借用(references-and-borrowing)

引用与借用&#xff08;references-and-borrowing&#xff09; 先看一个返回参数的所有权的代码 fn main() {let s1 String::from("hello");let (s2, len) calculate_length(s1);println!("The length of {} is {}.", s2, len); }fn calculate_length(…

云服务的划分IaaS,PaaS,SaaS 的区别

云服务只是一个统称&#xff0c;可以分成三大类。 三部分的命名&#xff1a; IaaS&#xff1a;基础设施服务&#xff0c;Infrastructure-as-a-servicePaaS&#xff1a;平台服务&#xff0c;Platform-as-a-serviceSaaS&#xff1a;软件服务&#xff0c;Software-as-a-service

yakit使用爆破编码明文_dnslog使用

yakit使用爆破编码密码 文章目录 yakit使用爆破编码密码yakit使用1 yakit编码密码进行爆破2 准备eval.php文件放入web3 访问http://192.168.225.206/eval.php,使用bp抓包,测试后环境准本好4 使用yakit4.1 进入页面&#xff0c;点击这里进行配置默认端口80834.2 发送到模糊测试4…

外汇天眼:重磅!WikiEXPO与澳大利亚计算机与法律协会达成战略合作

2023年10月19日&#xff0c;作为WikiGlobal旗下的知名品牌WiKiFX与澳大利亚计算机与法律协会&#xff08;AUSCL&#xff09;正式达成战略合作。对于整个金融行业来说&#xff0c;此次合作是双方共同推动技术和社会进步的一步&#xff0c;也是促进金融行业安全和创新方面迈出的重…

barzilar_borwein算法微调函数的优化收敛

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.4.2加载barzilar_borwein算法 import optimtool.unconstrain as ou barzilar_borwein ou.gradient_descent.barzilar_borwein初始化输入数据 f ( x ) ∑ i 1 n / 2 c ( x 2 i −…

Java数据结构之稀疏数组

目录 线性结构与非线性结构线性结构非线性结构 稀疏数组应用场景 代码实现二维数组转稀疏数组稀疏数组转二维数组 线性结构与非线性结构 线性结构 数据结构分两种&#xff0c;线性与非线性&#xff0c;线性结构的数据元素之间存在一对一的关系。 一对一指的是每个数据元素都…

线框图软件:Balsamiq Wireframes mac中文介绍

Balsamiq Wireframes mac是一款用于创建线框图的软件工具。它旨在帮助用户快速制作出清晰、简洁的界面原型&#xff0c;以便在设计和开发过程中进行协作和沟通。 Balsamiq Wireframes具有简单直观的用户界面&#xff0c;使用户能够快速添加和编辑各种用户界面元素&#xff0c;如…

当年很流行,现在已经淘汰的前端技术有哪些?

近几年&#xff0c;前端技术真可谓是飞速发展&#xff0c;不断有新的技术涌现&#xff0c;爆火的前端框架 Astro&#xff0c;前端运行时 Bun&#xff0c;构建工具 Vite 等都给前端提供了强大动力。当然&#xff0c;也有很多前端技术随着技术的发展不再需要使用&#xff0c;有了…