【从零开始的嵌入式生活】数据结构5——树

简介: 【从零开始的嵌入式生活】数据结构5——树

前言

这周因为不能出去就尽量把数据结构更完,每天一篇文章发布,请大家监督我,如果我没法请@我催更0.0

三连即可提高学习效率0.0


🧑🏻作者简介:一个学嵌入式的年轻人

✨联系方式:2201891280(QQ)

📔源码地址:https://gitee.com/xingleigao/study_qianrushi

⏳全文大约阅读时间: 120min

文章目录

前言

树的概念

二叉树

二叉树的性质

顺序存储结构

链式存储

二叉树的运算

二叉树的遍历

创建树

先序遍历实现

层序遍历请

写在最后

树的概念

数(Tree)是n(n>=0)个节点的有限集合T,它满足两个条件:


有且仅有一个特定的称为根(Root)的结点

其它结点可以分为m个互不相交的有限集合T1

相关概念:


一个节点的子树个数成为该节点的度数

一棵树的度数是树中节点的最大度数

度数为0的节点称为树叶或终端节点

度数不为0的节点称为分支节点

除根节点外的分支节点称为内部节点


一个节点系列k1,…kj.满足ki是ki+1的父节点称为一条k1到kj的路径

路径长度为j-1,即路径中的边数

路径中前面节点是后面节点的祖先,后面节点是前面节点的子孙

节点的层数等于父节点的层数+1,根节点的层数定义为1,树中结点层数最大值称为该树的高度或深度

树的逻辑结构:

树中任何节点都可以有0个或者等多个直接后继节点(子节点)。但至多只有一个直接前趋节点(父节点),根节点没有前趋节点,叶子节点没有后继节点。


二叉树

二叉树是n(n>=0)个节点的有限集合


空树

一个节点以及两颗互不相交的,分别称为左子树和右子树的二叉树组成。

严格区分左孩子和右孩子,即使只有一个子节点也要区分左右。


二叉树的性质

二叉树第i(i≥1)层上的节点最多为2i-1个。

深度为k(k≥1)的二叉树最多有2k-1个节点。

满二叉树:深度为k(k≥1)有2k-1个节点的二叉树。

完全二叉树:只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上。具有n个节点的完全二叉树的深度为(log2n)+1。

顺序存储结构

完全二叉树节点的编号方法是从上到下,从左到右,根节点为1号节点。设完全二叉树的节点数为n,某节点编号为i:


i>1(不是根节点)时,有父节点,其编号为i/2;

2i≤n时,有左孩子,其编号为2i ,否则没有左孩子,本身是叶节点;

2i+1≤n时,有右孩子,其编号为2i+1 ,否则没有右孩子;

i为奇数且不为1时,有左兄弟,其编号为i-1,否则没有左兄弟;

i为偶数且小于n时,有右兄弟,其编号为i+1,否则没有右兄弟;

有n个节点的完全二叉树可以用有n+1个元素的数组进行顺序存储,节点号和数组下标一一对应,下标为零的元素不用。

利用以上特性,可以从下标获得节点的逻辑关系。不完全二叉树通过添加虚节点构成完全二叉树,然后用数组存储,这要浪费一些存储空间。


链式存储

数据结构方式:


typedef  int  data_t ;  
typedef  struct  node_t;  
{
  data_t data ;   
  struct node_t *lchild ,*rchild ;  
} bitree_t ;    
bitree_t *root ;


二叉树的运算

二叉树的遍历

遍历:沿某条搜索路径周游二叉树,对树中的每一个节点访问一次且仅访问一次。

二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径进行遍历的问题。

由于二叉树的递归性质,遍历算法也是递归的。三种基本的遍历算法如下 :


先访问树根,再访问左子树,最后访问右子树;

先访问左子树,再访问树根,最后访问右子树;

先访问左子树,再访问右子树,最后访问树根;

创建树


bitree * tree_create(){
       data_t ch;
       bitree *r;
       scanf("%c", &ch);
       if(ch == '#')   return NULL;
       if((r = (bitree *)malloc(sizeof(bitree)))== NULL){
               printf("malloc failed\n");
               return NULL;
       }
       r->data = ch;
       r->left = tree_create();
       r->right = tree_create();
       return r;
}


输入AB#CD###E#FGH##K###就能创建成功,就是上面的先序遍历


先序遍历实现

void preorder(bitree *r){
       if(r == NULL)   return;
       printf("%c", r->data);
       preorder(r->left);
       preorder(r->right);
}


先序遍历就是:ABCDEFGHK

剩余的执行过程建议看看gitee代码。


层序遍历请



void layerorder(bitree *r){
       linkqueue *lq;
       if((lq = queue_create()) == NULL)
               return;
       if(r == NULL)   return;
       enqueue(lq, r);
       while(!queue_empty(lq)){
               r = dequeue(lq);
               printf("%c",r->data);
               if(r->left)
                       enqueue(lq, r->left);
               if(r->right)
                       enqueue(lq, r->right);
       }
}


输出顺序:ABECFDGHK


写在最后

二叉树的内容我写的比较草,因为我学过了,照着敲一敲就行了,大家也一定要敲一敲然后才能更好的理解,大家加油,接明天就是最后一个数据结构了,就是查找和排序,我尽量一天一更,大家和我一起变强呀!最后三连即可提高学习效率!!!


另外我在更新的就是算法笔记的一些例题笔记,这个系列是用于提高我的算法能力,如果有兴趣对算法领域感兴趣找不到合适的入门文章也可以追更,如果我更新的太慢了请大家点赞收藏,一键三连才能更有更新的动力呀0.0


相关文章
|
11月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
275 0
|
7月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
160 3
 算法系列之数据结构-Huffman树
|
7月前
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
517 19
|
9月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
197 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
9月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
188 12
|
9月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
168 10
|
12月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
351 64
|
9月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
263 3
|
11月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
291 5
|
11月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
398 16