ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构学习:树,二叉树和森林

2021-07-31 19:32:39  阅读:185  来源: 互联网

标签:结点 遍历 struct 一棵树 二叉树 数据结构 森林


数据结构学习:树,二叉树和森林

树是一种递归定义的的数据结构

双亲表示法(顺序存储)
每个结点中保存指向双亲的指针

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

在这里插入图片描述

孩子表示法(顺序+链式存储)
// 孩子表示法
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;

在这里插入图片描述

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

树与二叉树的转化(孩子兄弟表示法)
树中结点的左指针指向第一个孩子,右指针指向右边第一个兄弟,即可转化为二叉树

森林转化为二叉树
先把每一棵树都转化为二叉树,再连起来
Eg:
在这里插入图片描述

–>
在这里插入图片描述

二叉树转化为森林
二叉树的每一层的最右边的结点是森林中树的根节点

Eg:
在这里插入图片描述

在这里插入图片描述

树的先根遍历

//树的先根遍历,若树不为空,先访问根节点,再依次对每棵子树进行先根遍历
// 伪代码
void PreOrder(TreeNode *R)
{
	if(R != NULL)
	{
		visit(R);				//访问根节点
		while(R还有下一棵未访问的子树T)
			PreOrder(T);		//先根遍历下一棵子树
	}
}

树的后根遍历与其对应二叉树的中序遍历序列相同

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

树的层析遍历(用队列实现)

先序遍历森林(与对应二叉树的先序遍历一样)
若森林非空:
访问森林的第一棵树的根节点
先序遍历第一棵树中根节点的子树森林
先序遍历除去第一棵树之后的剩余的树构成的森林

中序遍历森林(效果等同于对应二叉树的中序遍历)
若森林非空:
中序遍历森林中第一棵树的根节点的子树森林
访问森林的第一棵树的根节点
中序遍历除去第一棵树之后的剩余的树构成的森林

标签:结点,遍历,struct,一棵树,二叉树,数据结构,森林
来源: https://blog.csdn.net/weixin_45632016/article/details/119280058

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有