编写算法由二叉树的动态二叉链表构造出相应的静态二叉链表。
答案先通过前序遍历获得静态链表的下标和data域,然后再通过队列和层次遍历获得静态链表的lchild rchild。实际上只通过前序遍历即可。
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char data;
int lchild,rchild;
}StaNode;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree *T);
void PreOrderTraverse(BiTree T,StaNode *w,int *k);
int main()
{
int n,k=1;
printf("How many:");
scanf("%d",&n);
StaNode *w;
w=(StaNode *)malloc(sizeof(StaNode)*(n+1));
BiTree *T;
T=(BiTree *)malloc(sizeof(BiTree));
printf("please create a %d nodes tree:\n",n);
CreateBiTree(T);
PreOrderTraverse(*T,w,&k);
int i;
for(i=1;i<=n;i++)
printf("%c %d %d\n",w[i].data,w[i].lchild,w[i].rchild);
return 0;
}
//创建动态二叉树
void CreateBiTree(BiTree *T)
{
fflush(stdin);
printf("please input the node data:");
int ch;
scanf("%c",&ch);
BiTree p;
p=(BiTree)malloc(sizeof(BiTNode));
p->data=ch;
*T=p;
char c;
fflush(stdin);
printf("Dose %c has left child(y--yes,n--no):",ch);
scanf("%c",&c);
if(c=='y')
CreateBiTree(&(*T)->lchild);
else
(*T)->lchild=NULL;
fflush(stdin);
printf("Dose %c has right child(y--yes,n--no):",ch);
scanf("%c",&c);
if(c=='y')
CreateBiTree(&(*T)->rchild);
else
(*T)->rchild=NULL;
}
//---通过前序遍历,在遍历过程中通过动态二叉链表构造相应的静态二叉链表---//
void PreOrderTraverse(BiTree T,StaNode *w,int *k)
{
if(T)
{
//通过k值作为变量在各次递归中的变化来获得左、右子结点的位置
int e=*k;
w[e].data=T->data;
if(T->lchild)
{
w[e].lchild=++(*k);
PreOrderTraverse(T->lchild,w,k);
}
else
w[e].lchild=0;
if(T->rchild)
{
w[e].rchild=++(*k);
PreOrderTraverse(T->rchild,w,k);
}
else
w[e].rchild=0;
}
}