树和森林和二叉树的转换实现

前言:树的存储结构/树和森林和二叉树的转换实现

参考文章: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

森林转换二叉树

我们知道,任意一棵普通树都可以转化为二叉树,而森林是由多棵普通树构成的,因此自然也可以转化为二叉树,其中只是比树转换二叉树多了一步,先将要森林切分成多个普通树先,然后再进行转化操作

具体步骤:

  • 首先将森林中所有的普通树各自转化为二叉树;

  • 将森林中第一棵树的树根作为整个森林的树根,其他树的根节点看作是第一棵树根节点的兄弟节点,采用孩子兄弟表示法将所有树进行连接

森林转二叉树,二叉树转森林

树的先根遍历 == 二叉树的先根遍历

树的后根遍历和二叉树的

森林前序遍历 == 对森林中的各个树的先序遍历 ,或者将森林转换为二叉树然后对其进行先序遍历

森林中序遍历 == 对森林中的各个树的后根遍历,或者将森林转换为二叉树然后对其进行中序遍历

posted @   zpchcbd  阅读(176)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示