把孩子双亲表示的树转(或其构成的森林)换为对应的二叉树,并对二叉树中序,先序,后序递归与非递归6种方式遍历C语言实现

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

1.将树转换为二叉树的方法如下:

在这里插入图片描述
如图所示:
在这里插入图片描述

2.将森林转换为二叉树的方法如图:

在这里插入图片描述

程序运行示例:

一般树转换为二叉树后的结果:
在这里插入图片描述
运行结果图:
在这里插入图片描述
如图所示,将图一所示的一般树(其任意节点都可以有任意多的子节点)转换为图二所示的二叉树(每个节点最多只能有两个叶子结点),程序实现的过程为:

  1. 首先创建一般树的孩子双亲表示法存储结构:
typedef struct child_parent_tnode//创建孩子双亲表示法树的节点 
{
	int data;//节点值 
	int parent;// 节点的双亲下标 
	child_parent_tnode *firstchild;//节点的指向第一个孩子的指针 
	child_parent_tnode *nextchild; //右兄弟指针 
} child_parent_tnode;
  1. 再创建二叉树的存储结构:
typedef struct binarylist//创建二叉树存储结构
{
	int data;//节点信息
	binarylist *lchild;//节点的左孩子
	binarylist *rchild;//节点的右孩子
};

3.引入栈的数据结构:

typedef  binarylist* type;
//引入栈的定义及基本操作
typedef struct
{
	type data[50];
	int top;
}stack;
void initialstack(stack *s)
{
	s->top = 0;
}
int push(stack *s, type x)
{
	if (s->top == 50)
		return -1;
	s->data[s->top++] = x;
	return 0;
}
type pop(stack *s)
{
	if (s->top == 0)
		exit(-2);
	type x = s->data[--s->top];
	return x;
}
bool isemty(stack *s)
{
	if (s->top == 0)
		return true;
	else
		return false;
}

4.将一般树按从上到下,从左到右的顺序,将节点存储到孩子兄弟存储结构数组中,为每一个节点指定节点信息,父节点索引号,第一个孩子的索引号,根据以上信息完成一般树的创建。
5. 根据一般树的节点个数创建等长的二叉树存储结构数组,根据一般树与二叉树的对应关系,建立二叉树。
6. 对二叉树进行递归先序后序中序遍历,用栈实现二叉树的非递归先序,中序,后序遍历。

将森林转换为二叉树的运行结果图:以方法中的图示为例:

在这里插入图片描述

完整代码(附加详细注释)下载:

  1. 把孩子双亲表示的树转换为对应的二叉树,并对二叉树中序,先序,后序递归与非递归6种方式遍历C语言实现(vs版本):代码详细注释
  2. 把孩子双亲表示的树转换为对应的二叉树,并对二叉树中序,先序,后序递归与非递归6种方式遍历C语言实现(devc++版本):代码详细注释
  3. 把孩子双亲表示的树(或其构成的森林)转换为对应的二叉树,并对二叉树中序,先序,后序递归与非递归6种方式遍历C语言实现(devc++版本):代码详细注释

猜你喜欢

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