二叉树与森林的转换

树、森林与二叉树的转换 树、森林与二叉树的转换 1、树转换为二叉树 由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号。 将树转换成二叉树的步骤是: (1)加线。就是在所有兄弟结点之间加一条连线; (2)抹线。就是对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线; (3)旋转。就是以树的根结点为轴心,将整棵树顺时针旋转一定... 阅读详情

    关键思路:利用递归建立节点完成转换。首先我们观察二叉树的结构,包含第一个孩子,及其兄弟。关键在于:那么我们在构造递归时,每层recursion中都必须找到对应sibling和firstchild。对于双亲表示法,我们很难找到孩子,对于孩子表示法,我们很难找到双亲(因为找到双亲是找到本节点兄弟的唯一方法,或在传参时也传入父节点指针)。
    不同形式间转换的技巧:对于要被转换的结构,需要传入针对它单次recursion完成结构内部所有成员构造对应的转换的结构的信息。就能完成一层递归。同时应注意递归结束的条件!

A) 孩子表示法生成二叉树算法:
typedef struct BiTree{
	ElemType data;
	struct BiTree *firstchild, *sibling;
}BTnode, *BTree;

typedef struct Lnode{
	int child;
	struct Lnode *next;
}Lnode, *CList;
typedef struct Cbox{
	ElemType data;
	CList firstchild;
}Cbox, *Cnode;
typedef struct CTnode{
	Cnode node;
	int n, r;
}CTree;

void TransformChildTreeToBinaryTree(CTree CT, BTree &BT, int preroot, int root){
	if (root == -1){
		BT = NULL; return;
	}
	BT = (BTree)malloc(sizeof(BTnode));
	BT->data = CT.node[root].data;
	int rsave;
	if (CT.node[root].firstchild){
		rsave = CT.node[root].firstchild->child;
	}
	else{
		rsave = -1;
	}
	TransformChildTreeToBinaryTree(CT, BT->firstchild, root, rsave);
	if (preroot == -1){
		BT->sibling = NULL; return;
	}
	CList p = CT.node[preroot].firstchild;
	while (p && p->data != root){
		p = p->next;
	}
	if (p->next){
		rsave = p->next->child;
	}
	else{
		rsave = -1;
	}
	TransformChildTreeToBinaryTree(CT, BT->sibling, preroot, rsave);
	return;
}

B) 孩子双亲表示法生成二叉树(类似于孩子表示法):

typedef struct BTnode{
	ElemType data;
	struct BTnode *firstchild, *sibling;
}BTnode, *BTree;

typedef struct Cnode{
	int child;
	struct Cnode *next;
}Cnode, *CList;
typedef struct CTnode{
	int parent;
	ElemType data;
	CList firstchild;
}CTnode, *CTbox;
typedef struct PCTnode{
	CTbox node;
	int r, n;
}PCTree;

void TransformPCTreeToBiTree(PCTree PC, BTree &BT, int root){
	if (root == -1){
		BT = NULL; return;
	}
	BT = (BTree)malloc(sizeof(BTnode));
	BT->data = PC.node[root].data;
	int rsave, tmp;
	if (PC.node[root].firstchild){
		rsave = PC.node[root].firstchide->child;
	}
	else{
		rsave = -1;
	}
	TransformPCTreeToBiTree(PC, BT->firstchild, rsave);
	tmp = PC.node[root].parent;
	if (tmp == -1){
		BT->sibling = NULL; return;
	}
	else{
		LList p = PC.node[tmp].firstchild;
		while (p && p->child != root){
			p = p->next;
		}
		if (p->next){
			rsave = p->next->child;
		}
		else{
			rsave = -1;
		}
		TransformPCTreeToBiTree(PC, BT->sibling, rsave);
		return;
	}
}
C)同构链式孩子表示法生成二叉树:
typedef struct BTnode{
	ElemType data;
	struct BTnode *firstchild, *sibling;
}BTnode, *BTree;

#define DEGREE 5
typedef struct LCTnode{
	ElemType data;
	struct LCTnode *child[DEGREE];
}LCTnode, *LCTree;


BTree InitialTransLCTree2BiTree(LCTree root){
	if (!root){
		return NULL;
	}
	BTree BTroot = (BTree)malloc(sizeof(BTnode));
	BTroot->data = LCTree->data;
	BTroot->sibling = NULL;
	TransformLinkedChildTreeToBinaryTree(BTroot->firstchild, root, 0);
	return BTroot;
}
void TransformLinkedChildTreeToBinaryTree(BTree &BT, LCTree LCT, int i){
	if (i >= DEGREE || !LCT->child[i]){
		BT = NULL; return;
	}
	BT = (BTree)malloc(sizeof(BTnode));
	BT->data = LCT->child[i]->data;
	TransformLinkedChildTreeToBinaryTree(BT, LCT->sibling, i + 1);
	TransformLinkedChildTreeToBinaryTree(BT->child[i], LCT->firstchild, 0);
	return;
}
D) 异构链式孩子表示法生成二叉树:
typedef struct BTnode{
	ElemType data;
	struct BTnode *firstchild, *sibling;
}BTnode, *BTree;

#ifdef DEGREE
#undef DEGREE
#define DEGREE 5
#endif

typedef struct LCTnode{
	ElemType data;
	struct LCTnode * *child;
	int degree;
}LCTnode, *LCTree;

void TransformLCTree2BinaryTree(LCTree LCT, BTree &BT, int i){
	if (i >= LCT->degree || !LCT->child[i]){
		BT = NULL; return;
	}
	BT = (BTree)malloc(sizeof(BTnode));
	BT->data = LCT->child[i]->data;
	TransformLCTree2BinaryTree(LCT, BT->sibling, i + 1);
	TransformLCTree2BinaryTree(LCT->child[i], BT->firstchild, 0);
	return;
}

//Another Method:
void TransformLCTree2BinaryTree2(LCTree LCT, BTree &BT){
	if (!LCT->child[0]){
		BT = NULL; return;
	}
	BTree p, q;
	for (int i = 0; i < LCT->degree && LCT->child[i]; ++i){
		BTree q = (BTree)malloc(sizeof(BTnode));
		q->data = LCT->child[i]->data;
		q->sibling = NULL;
		q->firstchild = NULL;
		if (!BT){
			BT = q;
			p = q;
		}
		else{
			q->sibling = p->sibling; p->sibling = q;
			p = q;
		}
		TransformLCTree2BinaryTree2(LCT->child[i], q->firstchild);
		return;
	}
}
D中共有两种方法的思路不同:前者是按单个节点完成递归, 而后者则是按照层来递归(虽然二者都是深度优先), 后者更像是图的遍历方法.

上面的算法仅供参考, 如果大家有疑惑或者更好的算法欢迎讨论,如有错误请大家指出和批评!


QT实现HTTP文件(夹)下载的完整流程与实战技巧 本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。 阅读详情

相关推荐

RS232/RS485/CAN_BUS 通信原理总结与通信波形分析

分析一:232串口信号要点:RS232,全双工,采用三线制传输分别为TXD\RXD\GND,其中TXD为发送信号,RXD为接收信号。在RS232中任何一条信号线的电压均为负逻辑关系。即:-15v ~ -3v 代表1 +3v ~ +15v 代表0测试结果与分析:如图所示,以传输一个8位二进制数值“01101010”为例,异步传输数据的一般格式为:起始位+校验位+数据位+停止位。其中,校验位为可选项。...

乔木鱼 1万+

树、森林与二叉树的相互转换

文章目录树转换为二叉树 树转换为二叉树  二叉树和树都可以用二叉链表作为存储结构,因此二叉链表可以导出树与二叉树的一个对应关系,即给定一棵树,可以找到唯一的一棵二叉树与之对应。其中树的二叉链表存储详情可参照树的存储结构及详细完整代码。  树转换成二叉树的规则:  <1>每个结点的左指针指向它的第一个孩子结点;  <2>每个结点的右指针指向它在树中的相邻兄弟结点。  可表示为"左孩子右兄弟"。 ...

薛定谔的猫的博客 2万+

CVAT本地部署保姆级教程:用Docker Compose在Ubuntu上5分钟搞定你的私有数据标注平台

本文提供CVAT本地部署的保姆级教程,详细讲解如何在Ubuntu系统上使用Docker Compose快速搭建私有数据标注平台。从环境准备、Docker配置到CVAT部署全流程,涵盖硬件要求、性能优化及安全加固等关键步骤,帮助开发团队5分钟内完成高效、安全的标注环境搭建。

weixin_42619742的博客 383

【数据结构】树、二叉树和森林的相互转换

一、树和二叉树的相互转换 ①加线:树中所有相邻兄弟加一条线 ②去线:对于树中的每个结点,只保留与其第一个孩子结点之间的连线,删去与其他孩子结点的连线 ③旋转:以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明,即可得到二叉树 ...

Jacky_Feng的博客 1万+

【电磁场与电磁波课程设计】基于HFSS的双频微带天线仿真及设计

第五代移动通信技术(5G)的商用已经近在眼前,作为移动通信中最为重要的功能组件,面向5G通信应用的手机天线与基站天线的技术研究与设计成为近年来的热点。随着移动通信中“跳频”“扩频”等通信技术发展,为了满足与多个终端的通信要求,实现多系统共用和收发共用等功能,这就要求天线在不同频段下工作。根据国家工信部的最新规定,5G移动通信的中频段被划定在3.3 GHz-3.5 GHz及4.8 GHz-5.0 GH,面向5G移动通信的天线应具有高增益、小型化、宽频段及高隔离度等技术特征,以满足5G通信的高传输速率、波束智能

weixin_44450575的博客 1万+

GEE数据融合——Landsat (collection 2,level 2 )4、5、7、8、9长时间序列影像数据融合和视频导出分析

长时间序列影像数据融合是指将Landsat影像数据集合2级2(Level 2)中的4、5、7、8和9这五个卫星的数据进行融合。具体来说,这包括将同一地点的多个卫星影像数据进行处理和整合,以产生一个单一的、具有更高质量的影像产品。在长时间序列影像数据融合中,首先需要对不同卫星的影像数据进行校正,以消除不同卫星之间的光谱差异、辐射度问题和几何纠正误差等。然后,通过使用融合算法,将多个卫星的影像数据进行组合,以生成一张全新的、高质量的合成影像。

此星光明博客 1733

【数据结构】树、森林与二叉树的转换(含详细图解)

👀在数据结构的世界里,树、森林和二叉树是重要的概念,它们之间存在着巧妙的转换关系,这种转换不仅具有理论意义,更在实际的算法设计和数据处理中有着广泛的应用。树、森林和二叉树之间的转换是数据结构中的重要内容,它们相互关联,通过这种转换关系,我们可以更好地利用不同结构的特点和优势,在各种应用场景中高效地处理数据和解决问题。

A Charmer 的博客 1万+

Simulink开发项1000例实战专栏--实例38:基于Simulink的周波变换器(Cycloconverter)

需求分析周波变换器(Cycloconverter),也称为频率变换器或直接变频器,是一种将输入的固定频率交流电直接转换为不同频率的交流电的电力电子设备。它广泛应用于工业领域,如大功率电机驱动、风力发电、船舶推进系统等场合。与传统的间接变频器(如交-直-交变频器)相比,周波变换器具有更高的效率和更简单的结构,适用于需要低频输出的应用场景。

xiaoheshang_123的博客 334

《数据结构C语言版》——树、森林与二叉树的转换(超详图解)

树、森林与二叉树之间的相互转换(详细图解)

青春无问西东 岁月自成芳华 1万+

15、z/OS 优化配置与迁移实践

本文详细探讨了z/OS环境的优化配置与迁移实践,涵盖DASD存储库管理、用户目录更新、环境更新意义以及不同场景下的迁移案例。通过单笔记本系统和服务器级机器的实例,展示了迁移流程和关键要点,包括DASD文件创建、设备映射更新、系统重启初始化以及数据备份等步骤。文章还总结了迁移过程中的注意事项,并展望了未来z/OS优化的发展趋势,为z/OS系统的稳定运行和高效管理提供了实用指导。

zzz56的博客 129

华为OD机试真题 新系统【网络数据包收发处理】

华为OD机试 新系统真题【网络数据包收发处理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【网络数据包收发处理】多语言题解。

qq_45776114的博客 444

【专题】森林和二叉树的转换

森林和二叉树的转换

qq_42340716的博客 6002

9.6华为OD机试真题 新系统 - 少儿爬山闯关积分游戏 (Java/Py/C/C++/Js/Go)

2026 华为OD机试真题9月6日华为OD上机新系统考试真题 100 分题型。

算法大师! 855

二叉树与树、森林之间的转换

一、森林、树转换成二叉树   树转化成二叉树的步骤: 树中所有相邻兄弟结点之间加一条线 对树中的每个结点只保留它与长子之间的连线,删除与其他孩子之间的连线 以树的根结点为轴心,将整棵树顺时针转动,使之结构层次分明 图例:   森林转化成二叉树的步骤: 将森林中的每棵树转化成相应的二叉树 第一颗二叉树不动,从第二颗树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子...

墩儿还是菜鸡 6万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

森林与二叉树的转换

什么是森林? 森林是多棵互不相交的树组成的集合。 森林要转换成二叉树,首先需要学会如何将树转换成二叉树。 树转换成二叉树 1.加线:所有兄弟结点之间加一条线; 2.去线:树中每一个结点,只保留与最左边孩子结点的连线,去掉所有与其他结点的连线; 3.旋转:以根节点为轴心,将树顺时针旋转一定角度,使其结构分明。 森林转换成二叉树 1.先将森林里的每一棵树转换成二叉树; 2.森...

qq_36415932的博客 3051

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

二叉树和树,森林的相互转换

树(Tree)是一种非线性的数据结构。树是n(n≥0)个节点的有限集。n=0时,称为空树。树由唯一的根和若干棵互不相交的子树组成。一棵树每一棵子树又是一棵树,也是由唯一的根节点和若干棵不相交的子树组成的。子树树的定义是递归的我们可以发现,树的定义是递归。大可以无限套娃!很容易想到,由树组成森林。若干棵互不相交的树的集合。理解了树,稍加限制条件就是二叉树了。二叉树就是有限制条件的树。限制条件有二:什么是度就不用我讲了吧。我还是讲吧,一句话带过。节点的度:节点拥有的子树个数或者分支的个数。

gost9070的博客 9262

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

森林转换成二叉树和二叉树转换成森林的递归算法。

C语言森林转换成二叉树和二叉树转换成森林等的递归算法。 假定普通树采用定长结点结构,而二叉树采用二叉链表结构 (1) 树转换成二叉树的算法: (i) 将原树的根结点转换为二叉树的根结点; (ii) 将原树根结点的所有子树按顺序逐一的转换为二叉树,将第一棵二叉树 作为二叉树根结点的左子树,后一棵二叉树做为前一棵二叉树的根结点 的右子树。 代码: #define MAX_DEGREE 10 //结点...

weixin_44352058的博客 2951

树与二叉树的相互转换以及森林和二叉树的相互转换

树与二叉树的相互转换以及森林和二叉树的相互转换一、孩子兄弟表示法二、树与二叉树的相互转换(1)1.树`T`转换成二叉树`B`(1)2.二叉树`B`转换成树`T`(1)三、森林和二叉树的相互转换(1)1.森林`F`转换成二叉树`B`(1)2.二叉树`B`转换成森林`F`(1)四、树与二叉树的相互转换(2)1.树`T`转换成二叉树`B`(2)2.二叉树`B`转换成树`T`(2)五、森林和二叉树的相互转...

mistakesglue的博客 1570

【数据结构】森林、树与二叉树相互转换

文章目录1、森林转二叉树2、树转二叉树3、二叉树转树4、二叉树转换为森林 森林、树与二叉树相互转换 1、森林转二叉树 (1)把每棵树转换为二叉树 (2)第一棵二叉树不动,从第二棵二叉树开始,一次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。 转换规则:兄弟相连,长兄为父,孩子靠左。 2、树转二叉树 (1)加线。在所有的兄弟结点之间加一条线。 (2)去线。树中的每个结点,只...

tangxz的博客 2943

树与二叉树的转换、森林与二叉树的转换、树和森林的遍历

文章目录将树转换成二叉树将二叉树转换成树将森林转换成二叉树将二叉树转换成森林树的遍历森林的遍历 由于树和二叉树都可以用二叉链表作存储结构,则以二叉链表作媒介可以导出树与二叉树之间的一个对应关系 将树转换成二叉树 ①加线:在兄弟之间加一连线 ②抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系 ③旋转:以树的根结点为轴心,将整树顺时针转45° 巧记:兄弟相连留长子 将二叉树转换成树 ①...

wmy0217_的博客 3543

树、森林、二叉树的转换

树、森林、二叉树的转换树变二叉树树变二叉树的规则:每个结点的左指针指向它的第一个孩子结点。右指针指向它在树中的相邻兄弟结点。 也即:左孩子右兄弟。 根没有兄弟,所以转换以后的树没有右子树。具体操作: + 在兄弟之间连线 + 对每一个结点,只保持它与第一个子结点(长子)的连线,与其他子结点的连线全部抹去。 + 以树根为轴心,顺时针旋转45度。二叉树变树二叉树变树的规则:是树变二叉树的逆过程。

Bing's Blog 1万+

二叉树、树、森林之间的转换

文章目录1.树转换为二叉树2.森林转换为二叉树3.二叉树转换成树4.二叉树转换成森林 1.树转换为二叉树 (1)加线。在所有兄弟结点之间加一条线。 (2)去线。对树中的每一个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。 (3)层次调整。以树的根结点为轴心,顺时针旋转一定角度。 2.森林转换为二叉树 (1)把每一个树转换为二叉树。 (2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一颗二叉树的根结点的右孩子,用线连接起来。当所有的二叉树连接起来后就得到了

weixin_51273111的博客 4492

二叉树转换为森林

前提: 假如一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则转换为一棵树。 转换规则: (1)、从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连续删除。直到所有这些根结点与右孩子的连线都删除为止。 (2)、将每棵分离后的二叉树转换为树。 ...

NJU phd 在读。 5万+

数据结构——树、二叉树和森林间的转换

介绍🍃数据结构专区数据结构参考该部分知识参考于《数据结构(C语言版 第2版)》129~130页🌈每一个清晨,都是世界对你说的最温柔的早安:ૢ(≧▽≦)و✨目录前言1、基础知识2、树转换为二叉树2.2 演示3、森林转换为二叉树3.2 演示4、二叉树转换为树或森林4.2 演示⑴加线——树中所有相邻兄弟结点之间加一条连线;⑵去线——对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点之间的连线;⑶层次调整——以根结点为轴心,将树顺时针转动一定的角度,使之层次分明。

2301_80492355的博客 1686
上一篇: 链表操作总结-包括链表合并、插入删除、清空复制、逆序
下一篇: Leetcode Repeated DNA Sequences
coderhuhy
博客等级 码龄12年 24粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值