IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构树 -> 正文阅读

[数据结构与算法]数据结构树

树的定义

线性结构:第一个数元素无前驱,最后一个数据元素无后继,中间节点一个前驱,一个后继
树结构: 根节点无双亲,叶节点无孩子,中间节点一个双亲,多个孩子

树的存储结构

双亲表示法

每个节点有一个data存储数据信息,一个parent存储双亲结点的下标

/*双亲表示法存储结构 parent*/
#define MAXSIZE 100
typedef int TElemType;

typedef struct PTNode
{
	TElemType data;
	int parent;
}PTNode;
typedef struct
{
	PTNode node[MAXSIZE];
	int r;    //根的位置
	int n;    //节点数量
}PTree;

很容易找到双亲节点;若要找它的孩子节点,需要遍历整棵树

孩子节点表示法

方案一:
指针域的个数等于树的度
在这里插入图片描述
在这里插入图片描述
这种存储对孩子节点数量相差比较大的比较浪费存储空间,好多都为空
方案二:
按照指针个数等于树的度,我们设置一个degree来存储每个节点的孩子数量
在这里插入图片描述
在这里插入图片描述
这种存储克服了对空间的浪费,但是每个结点的结构又不相同了
方案三:
每个结点的孩子以单链表的形式连接起来
在这里插入图片描述

/*树的孩子表示法结构定义*/

typedef struct CTNode //孩子结点
{
	int child;
	struct CTNode * next;
}*ChildPtr;
typedef struct  //表头结构
{
	TElemType data;
	ChildPtr firstChild;
}CTBox;
typedef struct  //树结构
{
	CTBox node[MAXSIZE];
	int r;    //根的下标
	int n;    //结点的数量
}CTree;

该存储结构对于查找孩子结点只需要遍历单链表即可,但对于查找双亲结点有点困难(可以在结点中加一个存储双亲结点的变量)

孩子兄弟表示法

/*树的孩子兄弟表示法*/
typedef struct CSNode
{
	TElemType data;
	struct CSNode * firstChild;
	struct CSNode * rightSib;
}CSNode,*CSTree;

把一颗复杂的树变成了二叉树

二叉树

存储结构

/*二叉树的二叉链表存储结构*/
typedef struct BiNode
{
	TElemType data;
	struct BiNode * lChild;
	struct BiNode * rChild;
}BiNode,*BiTree;

遍历

前序

/*二叉树的前序遍历递归算法*/
void PreOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	printf("%d ", T->data);
	PreOrderTraverse(T->lChild);
	PreOrderTraverse(T->rChild);
}

中序

/*二叉树的中序遍历递归算法*/
void InOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	InOrderTraverse(T->lChild);
	printf("%d ", T->data);
	InOrderTraverse(T->rChild);
}

后序

/*二叉树的后序遍历递归算法*/
void PostOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	PostOrderTraverse(T->lChild);
	PostOrderTraverse(T->rChild);
	printf("%d ", T->data);
}

建立二叉树

/*按照前序建立二叉树*/
void CreateBiTree(BiTree * T)
{
	TElemType ch;
	scanf("%c", &ch);
	if (ch == '#')
	{
		*T = NULL;
	}
	else
	{
		*T = (BiTree)malloc(sizeof(BiNode));
		(*T)->data = ch;
		CreateBiTree(&(*T)->lChild);
		CreateBiTree(&(*T)->rChild);
	}
}

线索二叉树

存储结构

/*二叉树的的线索存储结构*/
typedef enum 
{
	Link,   //0 指向左右孩子指针
	Thread  //1 指向前驱或后继指针
}PointerTag;
typedef struct BiThrNode
{
	TElemType data;
	struct BiThrNode * lChild;
	struct BiThrNode * rChild;
	PointerTag lTag; //左标志
	PointerTag rTag; //右标志
}BiThrNode,*BiThrTree;

线索化

/*中序的线索二叉*/
BiThrTree pre; //始终指向访问过的结点
void InThreading(BiThrTree p)
{
	if (p)
	{
		InThreading(p->lChild);

		if (!p->lChild)
		{
			p->lTag = Thread;
			p->lChild = pre;
		}

		if (!pre->rChild)
		{
			pre->rTag = Thread;
			pre->rChild = p;
		}
		pre = p;

		InThreading(p->rChild);
	}
}

中序遍历

/* 中序遍历线索二叉*/
void InOrderTraverse(BiThrTree T)
{
	BiThrTree p;
	p = T->lChild;
	while (p != T)
	{
		while (p->lTag == Link)
		{
			p = p->lChild;
		}
		printf("%c", p->data);
		while (p->rTag == Thread && p->rChild != T)
		{
			p = p->rChild;
			printf("%c", p->data);
		}
		p = p->rChild;

	}
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:40:50  更:2021-08-11 12:44:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 5:42:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码