设计算法求出二叉链表结构二叉树的顺序存储结构。
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct Node
{
char data;
struct Node *lchild,*rchild;
}Node,*BiTree;
typedef struct
{
BiTree H[maxsize];
int len;
}SqList;
int CreateBiTree(BiTree *T);
Status Binary2SqList(BiTree T,SqList *S);
int main()
{
SqList S;
S.len=1;
BiTree T;
T=(BiTree)malloc(sizeof(Node));
CreateBiTree(&T);
Binary2SqList(T,&S);
int i;
for(i=1;i<S.len;i++)
{
if(S.H[i])
printf("%c ",S.H[i]->data);
else
printf("# ");
}
return 0;
}
int CreateBiTree(BiTree *T)
{
fflush(stdin);
printf("please input the node data:");
char ch;
scanf("%c",&ch);
*T=(BiTree)malloc(sizeof(Node));
(*T)->data=ch;
char c;
fflush(stdin);
printf("Dose %c has leftchild(y--yes,n--no):",ch);
scanf("%c",&c);
if(c=='y')
CreateBiTree(&(*T)->lchild);
else
(*T)->lchild=NULL;
fflush(stdin);
printf("Dose %c has rightchild(y--yes,n--no):",ch);
scanf("%c",&c);
if(c=='y')
CreateBiTree(&(*T)->rchild);
else
(*T)->rchild=NULL;
return 0;
}
Status Binary2SqList(BiTree T,SqList *S)
{
if(!T)
return ERROR;
else
{
int j,LEAF=1; //LEAF变量代表是否为叶子结点层,即最后一层
S->H[S->len]=T;
j=S->len++;
if(T->lchild || T->rchild)
LEAF=0;
while(!LEAF)
{
int i,last=S->len;
LEAF=1;
for(i=j;i<last;i++) //通过j last来标示同一层结点
{
if(S->H[i] && S->H[i]->lchild)
{
S->H[S->len++]=S->H[i]->lchild;
if(S->H[i]->lchild->lchild || S->H[i]->lchild->rchild)
LEAF=0; //只要当前层遍历的结点任何一个结点有子结点,则该层非叶子层
}
else
S->H[S->len++]=NULL;
if(S->H[i] && S->H[i]->rchild)
{
if(S->H[i]->rchild->lchild || S->H[i]->rchild->rchild)
LEAF=0;
S->H[S->len++]=S->H[i]->rchild;
}
else
S->H[S->len++]=NULL;
}
j=i;
last=S->len; //i last重新标示下一层
}
printf("\n实际的最大下标:%d\n",S->len-1);
return OK;
}
}