二叉链表的建立

来源:互联网 发布:办公室网络布线方案 编辑:程序博客网 时间:2024/04/29 09:57

 二叉链表的建立
为了后面遍历二叉树方便,先介绍建立二叉链表的算法(假设elemtype 为char型)。
假设二叉链表的数据类型描述如刚才所述,为建立二叉链表,用一个一维表数组来模拟队列,存放输入的结点,但是,输入结点时,必须按完全二叉树形式,才能使结点间满足性质5,若为非完全二叉树,则必须给定一些假想结点(虚结点),使之符合完全二叉树形式。为此,我们在输入结点值时,存在的结点则输入它对应的字符,不存在的结点(虚结点),输入逗号,最后以一个特殊符号 "#"作为输入的结束,表示建二叉链表已完成。建成的二叉链表可以由根指针root唯一确定。
算法描述如下:
#include<iostream.h>
typedef char elemtype;
struct bitree
{ elemtype data;
bitree *lchild,*rchild;
};
bitree *create()
{ bitree *q[100]; //定义q数组作为队列存放二叉链表中结点,100为最大容量
bitree *s; //二叉链表中的结点
bitree *root ; //二叉链表的根指针
int front=1,rear=0; //定义队列的头、尾指针

char ch; //结点的data域值
root=NULL;
cin>>ch;
while(ch!='#') //输入值为#号,算法结束
{ s=NULL;
if(ch!=',') //输入数据不为逗号,表示不为虚结点,否则为虚结点
{ s=new bitree; s->data=ch;
s->lchild=NULL; s->rchild=NULL; }
rear++;
q[rear]=s; //新结点或虚结点进队
if(rear==1) root=s;
else
{ if((s!=NULL)&&(q[front]!=NULL))
{ if(rear%2==0) q[front]->lchild=s; //rear为偶数,s为双亲左孩子
else q[front]->rchild=s;} //rear为奇数,s为双亲右孩子
if(rear%2==1) front++; } //出队
cin>>ch;}
return root;
}