树和森林和二叉树的转换实现
前言:树的存储结构/树和森林和二叉树的转换实现
参考文章:http://data.biancheng.net/view/198.html
什么是孩子兄弟表示法
孩子兄弟表示法,采用的是链式存储结构,其存储树的实现思想是:从树的根节点开始,依次用链表存储各个节点的孩子节点和兄弟节点。
因此,该链表中的节点应包含以下3部分内容
- 节点的值
- 指向孩子节点的指针;
- 指向兄弟节点的指针;
#define ElemType int typedef struct CSNode{ ElemType data; struct CSNode * firstchild, *nextsibling; }CSNode,*CSTree;
上面可以看到,其实定义的跟二叉树的结点定义十分的相像,其实它们本来就差不多,孩子兄弟表示法就是其中一个指针表示了兄弟结点,其他都是一样的
孩子兄弟表示法的作用-树转换二叉树
先来看如下图所示,类似这种就是一个三叉树,在这个树的结构中,位于同一层的节点之间互为兄弟节点。
比如下面的节点 A、B 和 C 互为兄弟节点,而节点 D、E 和 F 也互为兄弟节点。
这里就需要注意,如果我们这里想要把将其转换为二叉树的话,那么就可以通过孩子兄弟表示法来进行表示出对应的二叉树的形式,如下图所示
因此,孩子兄弟表示法可以作为将普通树转化为二叉树的最有效方法,通常又被称为"二叉树表示法"或"二叉链表表示法"。
实现树转换二叉树
这里首先要知道的一点,我这里编写代码,不是说直接干脆的将多叉树转换二叉树,而是我们先通过一个用孩子兄弟表示法已经构造好的基于如下的_CSNode的结构体的一个树
typedef struct _CSNode{ char data; struct _CSNode* firstchild; struct _CSNode* nextsibling; }CSNode, *PCSNode;
然后我们通过解析这个树从而来构造一颗对应的二叉树,将其转换为如下格式的二叉树
typedef struct _TreeNode{ ElemType nodeData; //存储结点数据 struct _TreeNode* pLeftTreeNode; struct _TreeNode* pRightTreeNode; }TreeNode, *pTreeNode;
那么这里就需要先通过代码来创建一个基于_CSNode结构体(孩子兄弟表示法)表示的一个树的形式
1
上面已经创建完了基于孩子兄弟表示法表示的一个树,那么下面就继续来实现如何解析这颗树,让其转换为_TreeNode格式的二叉树的形式
1
森林转换二叉树
我们知道,任意一棵普通树都可以转化为二叉树,而森林是由多棵普通树构成的,因此自然也可以转化为二叉树,其中只是比树转换二叉树多了一步,先将要森林切分成多个普通树先,然后再进行转化操作
具体步骤:
-
首先将森林中所有的普通树各自转化为二叉树;
-
将森林中第一棵树的树根作为整个森林的树根,其他树的根节点看作是第一棵树根节点的兄弟节点,采用孩子兄弟表示法将所有树进行连接
森林转二叉树,二叉树转森林
树的先根遍历 == 二叉树的先根遍历
树的后根遍历和二叉树的
森林前序遍历 == 对森林中的各个树的先序遍历 ,或者将森林转换为二叉树然后对其进行先序遍历
森林中序遍历 == 对森林中的各个树的后根遍历,或者将森林转换为二叉树然后对其进行中序遍历
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY