【正确答案】二叉树采用顺序存储结构(一维数组)是按完全二叉树的形状存储的,不是完全二叉树的二叉树顺序存储时,要加“虚结点”。数组中的第一个元素是根结点。本题中采用队列结构。
typedef struct{
BiTree bt; //二叉树结点指针
int num;
}tnode; //nun是结点在一维数组中的编号
tnode Q[maxsize]; //循环队列,容量足够大
void creat(BiTree T, ElemType BT[]){ //深度h的二叉树存于一维数组BT[1..2h-1]中
//本算法生成该二叉树的二叉链表存储结构
tnode tq; //tq是队列元素
int len,i; //数组长度
len=strlen(BT);
T = (BiTree)malloc(sizeof(BiNode)); //申请结点
T->data=BT[1]; //根结点数据
tq.bt=T; tq.num=1;
Q[1]=tq; //根入队列
front=0; rear=1; //循环队列头、尾指针
while(front !=rear){ //当队列不空时循环
front=(front+1)%maxsize;
tq = Q[front]; p=tq.bt; i = tq.num; //出队,取出结点及编号
if(BT[2*i]=='#'||2*i>len) p->lchild = null; //左子树为空,'#'表示虚结点
else{ //建立左子女结点并入队列
p->lchild = (BiTree)malloc(sizeof(BiNode)); //申请结点空间
p->lchild->data = BT[2*i]; //左子女数据
tq.bt=p->lchild; tq.Bum = 2*i; rear = (rear+1)%maxsize; //计算队尾位置
Q[rear]=tq; //左子女结点及其编号入队
}
if(BT[2*i+1]=='#'||2*i+1>len)p->rchild = null; //右子树为空
else{ //建立右子女结点并入队列
p->rchild = (BiTree)malloc(sizeof(BiNode); //申请结点空间
p->rchild->data = BT[2*i+1]; tq.bt=p->rchild; tq.nun=2*i+1;
rear = (rear+1)%maxsize; Q[rear] = tq; //计算队尾位置,右子女及其编号入队
}
}//while
}
【答案解析】本题中的虚结点用'#'表示,应根据二叉树的结点数据的类型而定。