版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vivi_and_qiao/article/details/85550762
1.将树转换为二叉树的方法如下:
如图所示:
2.将森林转换为二叉树的方法如图:
程序运行示例:
一般树转换为二叉树后的结果:
运行结果图:
如图所示,将图一所示的一般树(其任意节点都可以有任意多的子节点)转换为图二所示的二叉树(每个节点最多只能有两个叶子结点),程序实现的过程为:
- 首先创建一般树的孩子双亲表示法存储结构:
typedef struct child_parent_tnode//创建孩子双亲表示法树的节点
{
int data;//节点值
int parent;// 节点的双亲下标
child_parent_tnode *firstchild;//节点的指向第一个孩子的指针
child_parent_tnode *nextchild; //右兄弟指针
} child_parent_tnode;
- 再创建二叉树的存储结构:
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. 对二叉树进行递归先序后序中序遍历,用栈实现二叉树的非递归先序,中序,后序遍历。