数据结构学习笔记-树

1.树的存储结构

(1)双亲表示法

顺序存储结点数据,结点中保存父节点在数组中的下标。

优点:找父节点方便;缺点:找孩子不方便

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

(2)孩子表示法

顺序存储结点数据,结点中保存孩子链表头指针(顺序+链式存储)。

优点:找孩子方便;缺点:找父节点不方便

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

(3)孩子兄弟表示法

用二叉链表存储树——左孩子右兄弟

孩子兄弟表示法存储的树,从存储视角来看形态上和二叉树类似。

树与二叉树的相互转换,本质上就是用孩子兄弟表示法存储树。

//树的存储————孩子兄弟表示法
typedef struct CSNode {ElemType data;    //数据域struct CSNode *firstchild,*nextsibling;    //第一个孩子和右兄弟指针
}CSNode,*CSTree;

(4)森林与二叉树的转换

本质:用二叉链表存储森林——左孩子右兄弟,森林中的各个树的根结点之间视为兄弟关系。

2.树的遍历

(1)树的先根遍历(深度优先遍历)

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

voidPreOrder(TreeNode *R){if(R!=NULL){visit(R);    //访问根节点while(R还有下一个子树T)PreOrder(T);    //先根遍历下一棵子树}
}

树的先根遍历序列与这棵树相应二叉树的先序序列相同。

(2)树的后根遍历(深度优先遍历)

若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点。

//树的后根遍历
void PostOrder(TreeNode *R){if(R!=NULL){while(R还有下一个子树T)PostOrder(T);    //后根遍历下一棵子树visit(R);    //访问根节点}
}

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

(3)树的层次遍历(广度优先遍历)

①若树非空,则根结点入队

②若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队

③重复②直到队列为空

3.森林的遍历

(1)森林的先序遍历

访问森林中第一棵树的根结点。先序遍历第一棵树中根节点的子树森林。先序遍历除去第一棵树后 剩余的树构成的森林。

效果等同于依次对二叉树的先序遍历。

(2)森林的中序遍历

中序遍历森林中第一棵树的根结点的子树森林。访问第一棵树的根结点。中序遍历除去第一棵树之后剩余的树构成的森林。

效果等同于依次对二叉树的中序遍历。

4.哈夫曼树

结点的权:有某种现实含义的数值(如:表示结点的重要性等)。

结点的带权路径长度:从树的根到该节点的路径长度(经过的边数)与该节点上权值的乘积。

树的带权路径长度:树中所有叶节点的带权路径长度之和。

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

哈夫曼树不唯一,因此哈夫曼编码不唯一。

若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码,前缀编码无歧义。

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

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

相关文章

微信小程序点击打开关联企业微信客服

wx.openCustomerServiceChat({extInfo: {url: https://work.weixin.qq.com/kfid/kfc****},corpId: *****,})

磁盘性能概述与磁盘调度算法

目录 1. 磁盘性能概述 1. 数据传输速率 2. 寻道时间 3. 旋转延迟 4. 平均访问时间 2. 早期的磁盘调度算法 1. FIFO(First-In-First-Out)调度算法 2. SSTF(Shortest Seek Time First)调度算法 3. SCAN(Elevator…

Dubbo3 服务原生支持 http 访问,兼具高性能与易用性

作者:刘军 作为一款 rpc 框架,Dubbo 的优势是后端服务的高性能的通信、面向接口的易用性,而它带来的弊端则是 rpc 接口的测试与前端流量接入成本较高,我们需要专门的工具或协议转换才能实现后端服务调用。这个现状在 Dubbo3 中得…

SVN 报错Error: Unable to connect to a repository at URL解决方法

1. 报错背景: 使用ssh 用svn拉取仓库代码时,出现如下报错: Can’t create session: Unable to connect to a repository at URL svn://127.0.0.1 …. Can’t connect to host ‘127.0.0.1’: Connection refused at C:/Program Files/Git/mi…

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分,不仅可以方便地连接手机,还能轻松连接电脑,让我们在工作和娱乐时享受无线的自由。然而,对于一些用户来说,将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…

从大型语言模型到大脑语言理解:探索话语理解的神经机制

随着科技的飞速发展,人工智能领域取得了令人瞩目的成就。在这其中,大型语言模型(LLMs)以其卓越的性能和广泛的应用前景,成为了当前研究的热点。然而,尽管LLMs在文本生成、语言翻译等领域展现出了惊人的能力…

镭速如何做到数据同步文件及文件夹的ACL属性?

数据文件同步时,除了要同步文件的内容,还要对文件的属性做同步。权限属性作为一个重要的文件属性,是属性同步的重中之重,控制着不同用户与用户组对文件和文件夹的访问权限。不同的操作系统有着自己不同的权限控制机制,…

2786. 访问数组中的位置使分数最大 Medium

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。 你 一开始 在数组的位置 0 处&#xff0c;你可以按照下述规则访问数组中的其他位置&#xff1a; 如果你当前在位置 i &#xff0c;那么你可以移动到满足 i < j 的 任意 位置 j 。 对于你访问的位置 i &#xff0c;…

C++ C_style string overview and basic Input funcitons

write in advance 最近在做题&#xff0c;遇到一个简单的将console的输入输出到文件中的简单题目&#xff0c;没有写出来。悔恨当初没有踏实地总结string 相关的 I/O 以及与文件的操作。这篇文章旨在记录基础的字符I/O, 简单常用的文件I/O操作函数。 当然&#xff0c;你会说C…

第2章 Rust初体验6/8:Option枚举及其变体:能避免空指针异常问题:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.6 故事4: 一直让玩家不断猜 我们全班要一起用三种语言来写第4个故事啦。这可能是我们所有故事中最复杂的一个了。不过别担心,贾克强已经把这个故事的需求都用投影仪展示出来了。 程序会提示玩家猜两个骰子的点数之和。如果玩家第一次输入点数之…

gitlab克隆本地切换p分支

使用 git clone 命令克隆远端仓库时&#xff0c;默认情况下只会克隆远端仓库的 master 分支。如果你需要克隆其他分支&#xff0c;需要在克隆仓库后手动检出相应的分支。例如&#xff0c;如果你想克隆并检出名为 p 的分支&#xff0c;可以这样做&#xff1a; 克隆仓库&#xf…

Spring Boot整合发送QQ邮箱功能

1. 创建Spring Boot项目 使用Spring Initializr&#xff08;https://start.spring.io/&#xff09;创建一个新的Spring Boot项目&#xff0c;并添加spring-boot-starter-mail依赖。 2. 添加配置 在application.properties或application.yml文件中添加QQ邮箱的SMTP配置。这里…

byzer 笔记总结

1.总览&#xff08;简单了解&#xff09; 1.1 数据挖掘的定义 基于大数据技术&#xff0c;针对有价值是业务场景&#xff0c;对数据中台沉淀的大量数据进行探索&#xff0c;分析。寻找数据与数据之间潜藏的关系&#xff0c;转化为自动化的算法模型&#xff0c;从而获取有价值的…

python-jenkins调用流水线设置“丢弃旧的构建”(discard old builds)

背景 Jenkins任务执行&#xff0c;随之构建次数增多&#xff0c;构建日志所占磁盘大小不断增大&#xff0c;需要配置清除策略。 而 discard old builds 就是配置丢弃旧的构建&#xff1b;若是我们使用python-jenkins 调用修改配置该如何设置&#xff1f; 调用设置 这里是按…

在远程服务器上安装虚拟环境

一、Anaconda环境安装 先下载Anaconda Linux版&#xff0c;并将其重命名为anaconda2020.sh wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2020.07-Linux-x86_64.sh --header"User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (K…

C++ static关键字详解

背景 前段时间初步整理了C中static的相关知识点&#xff0c;以此做个记录。 在C中&#xff0c;static关键字是常见的修饰符。从大方向上static分为两类&#xff1a; 1.类或结构体外的static 2.类或结构体内的static 因此&#xff0c;本文内容的划分如下&#xff1a; 接下来会…

Day07-06_13【CT】LeetCode手撕—1. 两数之和

目录 题目1-思路2- 实现⭐1. 两数之和——题解思路 3- ACM实现 题目 原题连接&#xff1a;1. 两数之和 1-思路 哈希表 利用哈希表存储 key 数组元素值 ——> value 数组下标遍历数组 2- 实现 ⭐1. 两数之和——题解思路 class Solution {public int[] twoSum(int[] nums…

Linux实验八:流式套接字编程

目录 一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1. 编辑源代码blockserver.c和blockclient.c步骤2. 编译源代码blockserver.c和blockclient.c步骤3. 运行可执行程序blockserver和blockclient 六、实验结果七、实验总结 一、实验目的 1、深入理解 TCP/…

嵌入式操作系统_3.操作系统内核架构

内核是操作系统的核心部分&#xff0c;它管理着系统的各种资源。内核可以看成连接应用程序和硬件的一座桥梁&#xff0c;是直接运行在硬件上的最基础的软件实体。目前从内核架构来划分&#xff0c;可分为宏内核&#xff08;Monolithic Kernel&#xff09;和微内核&#xff08;M…

网络编程(一)基本概念、TCP协议

文章目录 一、概念&#xff08;一&#xff09;网络发展阶段1. ARPAnet阶段2. TCP/IP两个协议阶段3. 网络体系结构和OSI开放系统互联模型4. TCP/IP协议簇体系结构&#xff08;1&#xff09; 应用层&#xff1a;&#xff08;2&#xff09;传输层&#xff1a;&#xff08;3&#x…