二叉树转换为森林的方法:
(1)加线:若某结点是其双亲的左孩子,则把该节点的右孩子、右孩子的右孩子·····都与该结点的双亲结点间加上连线。
(2)删线:删掉原来二叉树中所有双亲结点与右孩子间的连线。
(3)旋转调整:旋转、整理由(1)(2)两步得到的各种树,使之结构清晰,层次分明。
又如图所示:
C语言代码实现:
1.二叉树存储结构:
ypedef struct binarytreenode
{
char data;
binarytreenode *lchild;
binarytreenode *rchild;
}binarytreenode;//创建二叉树节点存储结构
2.带双亲的孩子兄弟表示法存储结构:
typedef struct parentchildnode
{
char data;
parentchildnode *parent;
parentchildnode *firstchild;
parentchildnode *nextchild;
}parentchildnode;//创建带双亲的孩子兄弟表示法树节点
3.通过先序的顺序输入根据其值创建二叉树,如果某个节点其左子树为空,则用 * 代替其左子树节点值,如果某个节点其右子树为空,则用 * 代替其右子树节点值:
binarytreenode* createbinarytree(binarytreenode *t, char *value)
{
static int i = 0;
char temp = value[i++];
if (temp == '*')
{
t = NULL;
return NULL;
}
else
{
t = (binarytreenode*)malloc(sizeof(binarytreenode));
t->data = temp;
/*t->lchild =NULL;
t->rchild =NULL;*/
t->lchild =createbinarytree(t->lchild, value);
t->rchild=createbinarytree(t->rchild, value);
}
return t;
}
4:将二叉树拆分成森林(森林中的每棵树都由带双亲的孩子兄弟表示法结点构成)
完整代码下载:先序输入构建将二叉树_并将二叉树转换为孩子兄弟双亲表示的一般树所构成的森林c语言实现
附测试用例:
ADJ*K**E**BFL**G*H**CI***
ADJ*K**E*MN*ZP**Q***BFL**G*H**CI***
ABC**DP**EO**FG*I**HJ***KL*N**M**```