您当前的位置: 首页 >  数据结构

哆啦A梦_i

暂无认证

  • 2浏览

    0关注

    629博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

数据结构(C语言第2版) 课后习题答案之第五章 树和二叉树

哆啦A梦_i 发布时间:2022-04-12 20:53:30 ,浏览量:2

目录

第5章  树和二叉树

一、选择题

二、应用题

(1)试找出满足下列条件的二叉树

(2)设一棵二叉树的先序序列: A B D F C E G H ,中序序列: B F D A G E H C

  (3) 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。

 (4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。

三、算法设计题

以二叉链表作为二叉树的存储结构,编写以下算法:

(1)统计二叉树的叶结点个数。

(2)判别两棵树是否相等。

(3)交换二叉树每个结点的左孩子和右孩子。

(4)设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)。

(5)计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。

(6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。

(7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。

(8)输出二叉树中从每个叶子结点到根结点的路径。

第5章  树和二叉树 一、选择题

(1)把一棵树转换为二叉树后,这棵二叉树的形态是(   )。              

A.唯一的                          B.有多种

C.有多种,但根结点都没有左孩子    D.有多种,但根结点都没有右孩子

(2)由3 个结点可以构造出多少种不同的二叉树?(    )

A.2          B.3             C.4          D.5   

(3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是(  )。

A.250         B. 500          C.254        D.501   

(4)一个具有1025个结点的二叉树的高h为(  )。

A.11          B.10             C.11至1025之间       D.10至1024之间

(5)深度为h的满m叉树的第k层有(  )个结点。(1=rchild==NULL)

return 1;                                //判断该结点是否是叶子结点(左孩子右孩子都为空),若是则返回1

else

return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);

}

(2)判别两棵树是否相等。 (3)交换二叉树每个结点的左孩子和右孩子。

void ChangeLR(BiTree &T)

{

BiTree temp;

if(T->lchild==NULL&&T->rchild==NULL)

return;

else

{

temp = T->lchild;

T->lchild = T->rchild;

T->rchild = temp;

}

ChangeLR(T->lchild);

ChangeLR(T->rchild);

}

(4)设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)。

void DoubleTraverse(BiTree T)

{

if(T == NULL)

return;

else if(T->lchild==NULL&&T->rchild==NULL)

coutlchild;   //左子女入队

if (p->rchild!=null)  Q[++rear]=p->rchild;   //右子女入队

   if (front>last)      //一层结束,

    {last=rear;

if(temp>maxw) maxw=temp;//last指向下层最右元素, 更新当前最大宽度

     temp=0;

 }//if    

}//while

  return (maxw);

}//结束width

(6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。

int Level(BiTree bt) //层次遍历二叉树,并统计度为1的结点的个数

{int num=0; //num统计度为1的结点的个数

     if(bt){QueueInit(Q); QueueIn(Q,bt);//Q是以二叉树结点指针为元素的队列

     while(!QueueEmpty(Q))

{p=QueueOut(Q); printf(p->data);     //出队,访问结点

if(p->lchild && !p->rchild ||!p->lchild && p->rchild)num++;//度为1的结点

if(p->lchild) QueueIn(Q,p->lchild); //非空左子女入队

if(p->rchild) QueueIn(Q,p->rchild); //非空右子女入队

}  }//if(bt)         

return(num); }//返回度为1的结点的个数

(7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。

[题目分析]因为后序遍历栈中保留当前结点的祖先的信息,用一变量保存栈的最高栈顶指针,每当退栈时,栈顶指针高于保存最高栈顶指针的值时,则将该栈倒入辅助栈中,辅助栈始终保存最长路径长度上的结点,直至后序遍历完毕,则辅助栈中内容即为所求。

void LongestPath(BiTree bt)//求二叉树中的第一条最长路径长度

{BiTree p=bt,l[],s[]; //l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点

  int i,top=0,tag[],longest=0;

  while(p || top>0)

   { while(p) {s[++top]=p;tag[top]=0; p=p->Lc;} //沿左分枝向下

 if(tag[top]==1)    //当前结点的右分枝已遍历

  {if(!s[top]->Lc && !s[top]->Rc)  //只有到叶子结点时,才查看路径长度

if(top>longest) {for(i=1;i0) {tag[top]=1; p=s[top].Rc;}   //沿右子分枝向下

   }//while(p!=null||top>0)

}//结束LongestPath

(8)输出二叉树中从每个叶子结点到根结点的路径。

[题目分析]采用先序遍历的递归方法,当找到叶子结点*b时,由于*b叶子结点尚未添加到path中,因此在输出路径时还需输出b->data值。对应的递归算法如下:

void AllPath(BTNode *b,ElemType path[],int pathlen)

{

    int i;

    if (b!=NULL)

    {

        if (b->lchild==NULL && b->rchild==NULL) //*b为叶子结点

        {

            cout lchild,path,pathlen); //递归扫描左子树

        AllPath(b->rchild,path,pathlen); //递归扫描右子树

        pathlen--;                       //恢复环境

    }

  }

}

关注
打赏
1556978864
查看更多评论
立即登录/注册

微信扫码登录

0.0423s