当前位置:   article > 正文

数据结构——二叉树的基本操作(C语言,完整优美实现)_二叉树的基本操作c语言

二叉树的基本操作c语言



前言

1.本文就介绍了数据结构中二叉树的五条性质以及二叉树的存储结构
2.二叉树的基本操作的编程实现,掌握二叉树的建立、先序,中序,后序遍历,复习对队列的基本操作,完成对子叶个数的计数以及对二叉树结点个数的计数


树的形式多种多样,本文着重介绍二叉树
提示:以下是本篇文章正文内容,下面案例可供参考

一、树是什么?

在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

①每个节点有零个或多个子节点;
②没有父节点的节点称为根节点;
③每一个非根节点有且只有一个父节点;
④除了根节点外,每个子节点可以分为多个不相交的子树;
  • 1
  • 2
  • 3
  • 4

二、该如何理解树?

数据结构的树,直接就可以把它看做现实中的树。最开始也是最重要的,就主干,在主干上又有很多分枝,枝干的作用显而易见,就是将每一片叶子绑定在主干上。每一个叶子同时也保持着与枝干的连接,各个两片叶子看似毫无关系,但是都有着共同的主干,从主干出发可以到任何一个叶子,也就是说,两个不同的叶子之间有一条路径可以相互到达。我们可以想象一下以树为样子的楼房,我们是不是只要从楼房的一层大门进去,就会有路径去到里面的各个房间呢?

三、各类树的存在形式

二叉树:每个结点的最多分出两个子结点

满二叉树二叉树,最后一层叶子结点为满,除了叶子结点外,每个结点都有两个子结点

完全二叉树:是满二叉树,但不同在于每个结点都有值(满二叉树可以有结点但是结点值为null)

平衡二叉树:是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉查找树

二叉查找树:若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
任意节点的左、右子树也分别为二叉查找树;(同一层左边结点永远小于右边)
没有键值相等的节点

红黑树:也是二叉查找树,自身的特点为:
每个节点或者是黑色,或者是红色。
根节点是黑色。
每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
如果一个节点是红色的,则它的子节点必须是黑色的。
从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
如图所示
在这里插入图片描述

霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树。
霍夫曼树的画法,是一种递归的体现,只需记住,永远从左往右画,同一层下以及子结点的左边永远小于右边
如图所示
在这里插入图片描述
用霍夫曼树通常来计算最小权值,使用霍夫曼树,大大减少了存储的开销。

B树:B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree),可以拥有最多2个子节点。与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。

1.根结点至少有两个子女。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
在这里插入图片描述

如图所示就是一颗符合规范的B树,由于相比于磁盘IO的速度,内存中的耗时几乎可以省略,所以只要树的高度足够低,IO次数足够小,就可以提升查询性能。

B树的增加删除同样遵循自平衡的性质,有旋转和换位。

B树的应用是文件系统及部分非关系型数据库索引。

B+树:在B树基础上,为叶子结点增加链表指针(B树+叶子有序链表),所有关键字都在叶子结点 中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中。

B*树:B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针

四、二叉树的遍历方式

深度遍历

运用递归方法,沿着树的深度遍历结点,尽可能深的搜索树的分支。当碰到没有被遍历的结点,进行遍历,如果该结点还有子结点,则进入子结点进行遍历。如果当前的节点所在的边都被搜索过,就回溯到当前节点所在的那条边的起始节点。一直重复直到进行到发现源节点所有可达的节点为止。

先序遍历

即先父结点,然后左结点,最后右结点

中序遍历

即先左结点,然后父结点,最后右结点

后序遍历

即先左结点,然后右结点,最后父结点

层次遍历

即我们通过对树的每一层,逐层扫描进行遍历

五、二叉树的实现

1.二叉树的实现

1.1 引入库以及设置结构体

我们用队列去存储使用过程中树的值

#include<stdio.h>
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/396899
推荐阅读
相关标签
  

闽ICP备14008679号