iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构中树与森林专项详解
  • 313
分享到

C语言数据结构中树与森林专项详解

C语言树与森林C语言树C语言森林 2022-11-13 19:11:26 313人浏览 安东尼
摘要

目录树的存储结构树的逻辑结构双亲表示法(顺序存储)孩字表示法(顺序+链式存储)孩子兄弟表示法(链式存储)森林树的遍历树的先根遍历(深度优先遍历)树的后根遍历(树的深度优先遍历)树的层

树的存储结构

树的逻辑结构

树是n(n≥0)个结点的有限集合,n=0时,称为空树,这是一种特殊情况。在任意--棵非空树中应满足:

1)有且仅有一个特定的称为根的结点。

2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集合T1,2....Tm,其中每个集合本身又是一-棵树,并且称为根结点的子树。

双亲表示法(顺序存储)

每个结点保存双亲的“指针”, 结点中保存父节点在数组的下标

优点:找父节点方便

缺点:找孩子不方便

删除元素方案一 ,数据删除后,parent 变为-1

删除元素方案二,数据删除后,将尾部数据填充到那

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

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

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

优点:找孩子方便

缺点:找双亲不方便

代码

#define MAX_TREE_SIZE 100    //树中最多结点树 
typedef struct{             //树的结点定义 
	Elemtype date;         //数据元素 
	int parent;           //双亲位置域  
}PTNode;             
typedef struct{                    //树的类型定义 
	PTNode nodes[MAX_TREE_SIZE];   //双亲表示 
	int n;                        //结点树 
}PTree;
struct CTNOde{
	int child; //孩子结点在数组的位置
	struct CTNode *next;   //下一个孩子 
}CTBox;
typedef struct {
	CTBox nodes[MAX_TREE_SIZE];
	int n,r;   //结点树和根的位置 
}; 

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

优点:可以用二叉树的操作来处理树

代码

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

森林

森林是m(m>=0)棵互不相交的树集合

森林中各个树的根结点之间是为兄弟关系

在二叉树中,如果是兄弟关系就在右边,如果是孩子就在左边,本质上,用二叉链表存储森林

树的遍历

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

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

上图这样一棵树的先根遍历顺序和二叉树的很像,按照二叉树的方法

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

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

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

上图这样一棵树的后根遍历顺序和二叉树的很像,按照二叉树的方法

 

代码

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

树的层序遍历(广度优先遍历)

层次遍历(用队列实现)

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

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

③重复②直到队列为空

如图

森林的遍历

森林。森林是m (m>0)棵互不相交的树的集合。每棵树去掉根节点后,其各个子树又组成森林。

先序遍历森林

效果等同于依次对各二叉树进行先序遍历

若森林为非空,则按如下规则进行遍历:

1.访问森林中第一棵树的根结点

2.先序遍历第一棵树中根结点的子树森林。

3.先序遍历除去第一棵树之后剩余的树构成的森林。

效果如下

中序遍历森林

效果等同于依次对二叉树进行中序遍历

若森林为非空,则按如下规则进行遍历:

中序遍历森林中第一棵树的根结点的子树森林。

访问第一棵树的根结点。

中序遍历除去第一棵树之后剩余的树构成的森林。

效果如下

到此这篇关于C语言数据结构中树与森林专项详解的文章就介绍到这了,更多相关C语言树与森林内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言数据结构中树与森林专项详解

本文链接: https://www.lsjlt.com/news/170879.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构中树与森林专项详解
    目录树的存储结构树的逻辑结构双亲表示法(顺序存储)孩字表示法(顺序+链式存储)孩子兄弟表示法(链式存储)森林树的遍历树的先根遍历(深度优先遍历)树的后根遍历(树的深度优先遍历)树的层...
    99+
    2022-11-13
    C语言树与森林 C语言树 C语言森林
  • C语言数据结构之二叉树详解
    目录1. 树概念及结构1.1树概念1.2树的表示2. 二叉树概念及结构2.1概念2.2数据结构中的二叉树2.3特殊的二叉树2.4二叉树的存储结构2.5二叉树的性质3. 二叉树顺序结构...
    99+
    2024-04-02
  • C语言数据结构详细解析二叉树的操作
    目录二叉树分类二叉树性质性质的使用二叉树的遍历前序遍历中序遍历后序遍历层序遍历求二叉树的节点数求二叉树叶子结点个数求二叉树的最大深度二叉树的销毁二叉树分类 满二叉树 除最后一层无任何...
    99+
    2024-04-02
  • 详解C语言数据结构之栈
    目录栈的链式实现主要内容代码实现:总结栈的链式实现 主要内容 (1) 栈包含7个元素,依次是67,3,88,6,1,7,0,采用尾插入法创建 栈,为该栈设置两个指针,一个bottom...
    99+
    2024-04-02
  • C语言二叉树的概念结构详解
    目录1、树的概念及结构(了解)1.1树的概念:1.2树的表示法:2、二叉树的概念及结构2.1二叉树的概念2.2特殊的二叉树2.2二叉树的性质2.3二叉树的顺序存储2.4二叉树的链式存...
    99+
    2022-11-13
    C语言二叉树 C语言二叉树的创建
  • C语言数据结构哈希表详解
    #include <stdio.h> #include <stdlib.h> #include <string.h> // 哈...
    99+
    2024-04-02
  • C语言数据结构与算法之字符串详解
    目录串的定义串的比较 串的抽象数据类型串的初始化相关定义初始化定长类初始化串的堆式顺序存储结构(Heap)初始化堆字符串 赋值操作比较两个堆字符串的大小 串的定义...
    99+
    2024-04-02
  • C语言 链式二叉树结构详解原理
    目录前言二叉树节点声明二叉树的遍历构建二叉树1.前序遍历2.中序遍历3.后序遍历二叉树节点的个数二叉树叶子节点的个数二叉树第K层节点个数二叉树的高度/深度二叉树查找值为x的节点整体代...
    99+
    2024-04-02
  • C++详解数据结构中的搜索二叉树
    目录定义查找某个元素构造搜索二叉树往搜索二叉树中插入元素搜索二叉树删除节点定义 搜索二叉树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树: 1、若任意节点的左子树...
    99+
    2024-04-02
  • C语言数据结构之堆排序详解
    目录1.堆的概念及结构2.堆的实现2.1 堆的向下调整算法2.2 堆的向上调整算法2.3 建堆(数组)2.4 堆排序2.5 堆排序的时间复杂度1.堆的概念及结构 如果有一个关键码的集...
    99+
    2024-04-02
  • Go语言数据结构之二叉树可视化详解
    目录题目源代码做题思路扩展左右并列展示上下并列展示总结回顾题目 以图形展示任意二叉树,如下图,一个中缀表达式表示的二叉树:3.14*r²*h/3 源代码 package ...
    99+
    2024-04-02
  • Javascript中扁平化数据结构与JSON树形结构转换详解
    目录一. 先说简单的树形结构数扁平化处理二. 再讲将扁平化数据结构转JSON树状形结构扩充一个知识点:for in 与 for of 的区别 :总结不废话,直接开干 一. 先说简单的...
    99+
    2024-04-02
  • C语言数据结构二叉树递归的方法
    本篇内容介绍了“C语言数据结构二叉树递归的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、二叉树的遍历算法二叉树的精髓在于遍历。遍历掌...
    99+
    2023-06-30
  • C语言数据结构之队列算法详解
    目录一、前言二、基本概念三、顺序队列四、链队列五、循环队列六、总结与提高一、前言 队列在程序设计中经常出现,如:操作系统中的排队问题。 这篇文章主要介绍了队列的...
    99+
    2024-04-02
  • C语言数据结构二叉树之堆的实现和堆排序详解
    目录一、本章重点二、堆2.1堆的介绍2.2堆的接口实现三、堆排序一、本章重点 堆的介绍堆的接口实现堆排序 二、堆 2.1堆的介绍 一般来说,堆在物理结构上是连续的数组结构,在逻辑结构...
    99+
    2024-04-02
  • C语言植物大战数据结构二叉树堆
    目录前言堆的概念创建结构体初始化结构体销毁结构体向堆中插入数据1.堆的物理结构和逻辑结构2.完全二叉树下标规律3.插入数据思路依次打印堆的值删除堆顶的值判断堆是否为空求堆中有几个元素...
    99+
    2024-04-02
  • C语言数据结构与算法之队列的实现详解
    目录队列的概念及结构队列的实现Queue.hQueue.cTest.c队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FI...
    99+
    2022-11-13
    C语言数据结构 队列 C语言 队列实现 C语言 队列
  • C语言详细讲解树状数组与线段树
    目录树状数组动态求连续区间和数星星线段树动态求连续区间和数列区间最大值树状数组 动态求连续区间和 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,...
    99+
    2024-04-02
  • 详解C语言内核中的链表与结构体
    Windows内核中是无法使用vector容器等数据结构的,当我们需要保存一个结构体数组时,就需要使用内核中提供的专用链表结构LIST_ENTRY通过一些列链表操作函数对结构体进行装...
    99+
    2024-04-02
  • C语言植物大战数据结构二叉树递归
    目录前言一、二叉树的遍历算法1.构造二叉树2.前序遍历(递归图是重点.)3.中序遍历4.后序遍历二、二叉树遍历算法的应用1.求节点个数3.求第k层节点个数4.查找值为x的节点5.二叉...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作