先序输入构建将二叉树_并将二叉树转换为孩子兄弟双亲表示的一般树所构成的森林c语言实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vivi_and_qiao/article/details/86147092

二叉树转换为森林的方法:

(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**```

猜你喜欢

转载自blog.csdn.net/vivi_and_qiao/article/details/86147092