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

 更新时间:2022年11月07日 09:51:08   作者:莫浅子  
这篇文章主要介绍了C语言数据结构中树与森林,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

树的存储结构

树的逻辑结构

树是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语言树与森林内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现扫雷游戏(可以自动展开)

    C语言实现扫雷游戏(可以自动展开)

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,可以自动展开,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Cocos2d-x中使用CCScrollView来实现关卡选择实例

    Cocos2d-x中使用CCScrollView来实现关卡选择实例

    这篇文章主要介绍了Cocos2d-x中使用CCScrollView来实现关卡的选择实例,本文在代码中用大量注释讲解了CCScrollView的使用,需要的朋友可以参考下
    2014-09-09
  • 关于C++11中限定作用域的枚举类型的问题

    关于C++11中限定作用域的枚举类型的问题

    C++中有两种类型的枚举:不限定作用域的枚举类型和限定作用域的枚举类型。限定作用域的枚举类型是C++11标准引入的新类型,对C++11中限定作用域的枚举类型相关知识感兴趣的朋友一起看看吧
    2022-01-01
  • 基于Matlab实现野狗优化算法的示例代码

    基于Matlab实现野狗优化算法的示例代码

    野狗优化算法(Dingo Optimization Algorithm, DOA)模仿澳大利亚野狗的社交行为。DOA算法的灵感来源于野狗的狩猎策略,即迫害攻击、分组策略和食腐行为。本文将通过Matlab实现这一算法,感兴趣的可以了解一下
    2022-04-04
  • VS C++头文件引用提示“未定义标识符”的问题解决

    VS C++头文件引用提示“未定义标识符”的问题解决

    本文主要介绍了VS C++头文件引用提示“未定义标识符”的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C语言中数组排序浅析

    C语言中数组排序浅析

    这篇文章主要为大家介绍了C语言算法练习中数组元素排序的四种类型,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-12-12
  • C++实现航空订票系统课程设计

    C++实现航空订票系统课程设计

    这篇文章主要为大家详细介绍了C++实现航空订票系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 使用C语言解决字符串全排列问题

    使用C语言解决字符串全排列问题

    这篇文章主要介绍了使用C语言解决字符串全排列问题,文中包括了一道ACM相关的竞赛题目作为实例,需要的朋友可以参考下
    2015-08-08
  • 分享面试官常用16个c/c++面试题

    分享面试官常用16个c/c++面试题

    这篇文章主要分享的是面试官常用的16个c/c++面试题, C中static有什么作用、C++中const有什么用?C与C++各自是如何定义常量的?有什么不同?等等问题,具有一定的参考资料,需要的小伙伴可以参考一下
    2022-01-01
  • C语言详解strcmp函数的分析及实现

    C语言详解strcmp函数的分析及实现

    strcmp函数语法为“int strcmp(char *str1,char *str2)”,其作用是比较字符串str1和str2是否相同,如果相同则返回0,如果不同,前者大于后者则返回1,否则返回-1
    2022-05-05

最新评论