问答题
已知深度为h的二叉树采用顺序存储结构_已存放于数组BT[1.2
h
一1]中,请写一非递归算法,产生该二叉树的二叉链表结构。设二叉链表中链结点的构造为(1ehild,data,rehild),根结点所在链结点的指针由T给出。【北京航空航天大学2007年】
【正确答案】正确答案:二叉树采用顺序存储结构(一维数组)是按完全二叉树的形状存储的,不是完全二叉树的二叉树顺序存储时,要加“虚结点”。数组中的第一个元素是根结点。算法的基本设计思想:采用队列结构,先建立根结点入队。当队列不空时循环执行以下步骤:队头结点出队,如果有左孩子,则建立左孩子结点并入队;如果有右孩子,则建立右孩子结点并入队。算法的代码: typedef struct{ BiTree bt: //二叉树结点指针 int num; //num是结点在一维数组中的编号 }tnode tnode Q[maxsize]; //循环队列,容量足够大 void creat(BiTree T,E1emType BT[],int h){ //深度为h的二叉树存于一维数组BT[1..2
h
一1]中 //本算法生成该二叉树的二叉链表存储结构 tnode tq; //tq是队列元素 int len=pow(2,h)一1; //数组长度 T=(BiTree)malloc(Si zeof(BiNode));//申请结点 T一>data=BT[1]; //根结点数据 tq.bt=T; tq.num=1; Q[1]=tq; //根入队列 front=0; //循环队列头、尾指针 rear=1; while(front!=rear) { //当队列不空时循环 front=(front+1)%maxsi ze; tq:Q[front]; //出队,取出结点及编号 p=tq.bt; i=tq.num; if(BT[2+i]=="#"||2*i>len) //左子树为空,"#",表示虚结点 P一>ichild=NULL; else { //建立左子女结点并入队列 p一>lchiid=(BiTree)melloc(Sizeof(BiNode)); p->ichild->data=BT[2*i]; //左子女数据 tq.bt=P一>1child; tq.num=2*i; rear=(rear+1)%maxsize; //计算队尾位置 Q[rear]=tq; //左子女结点及其编号入队 } if(BT[2*i+1]=="#"||2*i+1>len) p->rchild=NULL; //右子树为空 e1Se { //建立右子女结点并入队列 P一>rchild=(BiTree)mallOC(Si Zeof(BiNode)); P一>rchild一>data=BT[2*i+1]; tq.bt=P一>rchild: tq.num=2*i+1; rear=(rear+1)%maxsi ze; //计算队尾位置,右子女及其编号入队 Q[rear]=tq; } }//while }//Creat 本题中的虚结点用"#"表示,应根据二叉树的结点数据的类型而定。
【答案解析】