问答题
二叉树采用二叉链表存储。1)编写计算整个二叉树高度的算法(二叉树的高度也称为二叉树的深度)。2)编写计算二叉树最大宽度的算法(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。【西北大学2001年】
【正确答案】正确答案:算法的基本设计思想:利用递归算法求二叉树高度:计算出某结点左右子树的高度,取大值加1即是以该结点为根的子树的高度。求最大宽度可采用层次遍历的方法,记下各层结点数,每层遍历完毕,若结点数大于原先最大宽度,则修改最大宽度。算法的代码: int Height(BiTree bt){ //求二叉树bt的深度 int h1,hr; if(bt==NULL) return O; e1Se hl=Height(bt一>lch); hr=Height(bt一>rch); if(h1>hr) return h1+1; e1se return hr+1: } } int Width(BiTree bt){ //求二叉树bt的最大宽度 if(bt==NULL) //空二叉树宽度为0 return 0; e1se { BiTree Q[]; //Q是队列,元素为二叉树结点指针,容量足够大 front=1 ; //队头指针 rear=1; //队尾指针 last=1; //同层最右结点在队列中的位置 temp=0; //记局部宽度 maxw=0; //记最大宽度 Q[rear]=bt; //根结点入队列 while(front<=1ast) { P=Q[front++]; temp++; //同层元素数加l if(P一>lchiid!=NULL) Q[++rear]=p->ichild;//左子女入队 if(P一>rchild!=NULL) Q[++rear]=p一>rchild;//右子女入队 if(front>1ast) {//一层结束, last=rear; if(temp>maxw) maxw=temp; //last指向下层最右元素,更新当前最大宽度 temp=0, 、}//if }//while }//else return maxw; }//width
【答案解析】