欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    数据结构第六章习题课.docx

    • 资源ID:3560261       资源大小:43.83KB        全文页数:14页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构第六章习题课.docx

    数据结构第六章习题课1、下图所示的4棵二叉树中,不是完全二叉树的是 A B C D 2、二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法。 A、正确 B、错误 C、不一定 3、已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是。 A、acbed B、decab C、deabc D、cedba 4、如果T2是由有序树T转换而来的二叉树,那么T中结点的后序就是T2中结点的。 A、前序 B、中序 C、后序 D、层次序 5、深度为5的二叉树至多有个结点。 A、16 B、32 C、31 D、10 6、在一个非空二叉树的中序遍历序列中,根结点的右边。 A、只有右子树上的所有结点 B、只有右子树上的部分结点 C、只有左子树上的部分结点 D、只有左子树上的所有结点 7、树最适合用来表示。 A、有序数据元素 B、无序数据元素 C、元素之间具有分支层次关系的数据 D、元素之间无联系的数据。 8、任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序。 A、不发生改变 B、发生改变 C、不能确定 D、以上都不对 9、实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用存储结构。 A、二叉链表 B、广义表存储结构 C、三叉链表 D、顺序存储结构 10、对一个满二叉树,m个树叶,n个结点,深度为h,则。 A、n=m+h B、h+m=2n C、m=h-1 D、n=2h-1 11、设n,m为二叉树上的两个结点,在中序遍历时,n在m前的条件是。 A、n在m右方 B、n是m祖先 C、n在m左方 D、n是m子孙 12已知一算术表达式的中缀形式为 A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为( ) A-A+B*C/DE B. -A+B*CD/E C-+*ABC/DE D. -+A*BC/DE / 13. 设有一表示算术表达式的二叉树, + + 它所表示的算术表达式是 A. A*B+C/(D*E)+(F-G) B. (A*B+C)/(D*E)+(F-G) * C * - C. (A*B+C)/(D*E+) D. A*B+C/D*E+F-G D E F G A B 14. 在下述结论中,正确的是 只有一个结点的二叉树的度为0; 二叉树的度为2; 二叉树的左右子树可任意交换; 深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。 A B C D 15. 设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是 Am-n Bm-n-1 Cn+1 D条件不足,无法确定 16若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是 A9 B11 C15 D不确定 17一棵完全二叉树上有1001个结点,其中叶子结点的个数是 A 250 B 500 C254 D505 E以上答案都不对 18. 一个具有1025个结点的二叉树的高h为 A11 B10 C11至1025之间 D10至1024之间 19深度为h的满m叉树的第k层有个结点。(1=<k=<h) Amk-1 Bmk-1 Cmh-1 Dmh-1 20. 利用二叉链表存储树,则根结点的右指针是。 A指向最左孩子 B指向最右孩子 C空 D非空 21对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用( )次序的遍历实现编号。 A先序 B. 中序 C. 后序 D. 从根开始按层次遍历 22若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用( )遍历方法最合适。 A前序 B中序 C后序 D按层次 23一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足 A所有的结点均无左孩子 B所有的结点均无右孩子 C只有一个叶子结点 D是任意一棵二叉树 24. 若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则x的前驱为( ) A.X的双亲 B.X的右子树中最左的结点 C.X的左子树中最右结点 D.X的左子树中最右叶结点 25. 线索二叉树是一种结构。 A 逻辑 B 逻辑和存储 C 物理 D线性 26n个结点的线索二叉树上含有的线索数为 A2n Bnl Cnl Dn 27下面几个符号串编码集合中,不是前缀编码的是。 A0,10,110,1111 B11,10,001,101,0001 C00,010,0110,1000 Db,c,aa,ac,aba,abb,abc 28. 当一棵有n个结点的二叉树按层次从上到下,同层次从左到右将数据存放在一维数组 Al.n中时,数组中第i个结点的左孩子为 AA2i(2i=<n) B. A2i+1(2i+1=< n) CAi/2 D无法确定 29、高度为h的完全二叉树至少有多少个结点?至多有多少个结点? 解:高度为h的完全二叉树至少有2h-1个结点,至多有2h-1个结点(也就是满二叉树)。 30、在什么样的情况下,等长编码是最优的前缀码? 答:在每个字符的使用概率相同的情况下,也即在哈夫曼树中每片叶子的权重相等的时候,等长编码是最优的前缀码。 31.假设在树中,结点x是结点y的双亲时,用(x,y)来表示树边。已知一棵树边的集合为(i,m),(i,n),(e,i),(b,e),(b,d),(a,b),(g,j),(g,k),(c,g),(c,f),(h,l),(c,h),(a,c)用图表示出此树,并回答下列问题: (1)哪个是根结点? (2)哪些是叶结点? (3)哪个是g的双亲? (4)哪些是g的祖先? (5)哪些是g的孩子? (6)哪些是e的子孙? (7)哪些是e的兄弟?哪些是f的兄弟? (8)结点b和n的层次各是多少? (9)树的深度是多少? (10)以结点c为根的子树的深度是多少? (11) 树的度数是多少? 答:这是测试我们对树的基本概念的掌握情况。 a是根结点;mndfjkl是叶结点;c是g的双亲;c,a是g的祖先; j,k是g的孩子;imn是e的子孙;d是e的兄弟,g,h是f的兄弟; b的层次是2,n的层次是5;树的深度是5;以c为根的子树深度是3; 树的度数是3。 32、试找出分别满足下面条件的所有二叉树: (1)前序序列和中序序列相同; (2)中序序列和后序序列相同; (3)前序序列和后序序列相同; (4)前序、中序、后序序列均相同。 答: (1) 前序序列和中序序列相同的二叉树是:没有左子树的二叉树(右单支树)。 (2) 中序序列和后序序列相同的二叉树是:没有右子树的二叉树(左单支树)。 (3) 前序序列和后序序列相同的二叉树是:只有根结点的二叉树。 (4) 前序、中序、后序序列均相同的二叉树:只有根结点的二叉树。 33、对二叉树中的结点进行按层次顺序(每一层自左至右)的访问操作称为二叉树的层次遍历,遍历所得到的结点序列称为二叉树层次序列。现已知一棵二叉树的层次序列为ABCDEFGHIJ,中序序列为DBGEHJACIF,请画出此二叉树。 解: A / B C / D E F / / G H I J 34、对下图所示的森林: (1)求各树的前序序列和后序序列; (2)求森林的前序序列和后序序列; (3)将此森林转换为相应的二叉树; (4)给出(a)所示树的以双亲链表表示、孩子链表表示、双亲孩子链表表示及孩子兄弟链表表示等四种存储结构,并指出哪些存储结构易于求指定结点的祖先,哪些易于求指定结点的后代? 解: (1) (a)的前序序列:ABCDEF 后序序列:BDEFCA (b)的前序序列:GHIJK 后序序列:IJKHG (c)的前序序列:LMPQRNO 后序序列:QRPMNOL (2) 此森林的前序序列: ABCDEFGHIJKLMPQRNO 此森林的后序序列: BDEFCAIJKHGQRPMNOL (3) 略 (4) 略 35完全二叉树中,结点个数为n,则编号最大的分支结点的编号为 。 答:ën/2û 36二叉树结点的对称序序列为A,B,C,D,E,F,G,后序序列为B,D,C,A,F,G,E,则该二叉树结点的前序序列为(1) ,则该二叉树对应的树林包括 (2) 棵树。 答:(1)EACBDGF 2 37具有n个结点的满二叉树,其叶结点的个数是_。 答:(n+1)/2 设内部节点数为a,叶节点数为b,明显有a+b=n (1),非空满二叉树中所有节点的出度正好等于入度,每个内部节点出度为2,叶节点出度为0,所有节点的出度和为2a;根节点入度为0,其他节点的入度为1,所有节点的入度和为a+b-1;因此有2a=a+b-1 (2)。由(1)(2)得b=(n+1)/2,a=(n-1)/2。另外可得b=a+1,也就是说,非空满二叉树的叶节点数正好比内部节点数多1。 38设一棵后序线索树的高是50,结点x是树中的一个结点,其双亲是结点y,y的右子树高度是31,x是y的左孩子。则确定x的后继最多需经过_中间结点 答:31 39有一份电文中共使用 6个字符:a,b,c,d,e,f,它们的出现频率依次为2,3,4,7,8,9,试构造一棵哈夫曼树,则其加权路径长度WPL为(1),字符c的编码是(2)。 答:(1)80 (2)001 40下面是求二叉树高度的类C写的递归算法,试补充完整。 说明二叉树的两指针域为lchild与rchild, 算法中p为二叉树的根,lh和rh分别为以p为根的二叉树的左子树和右子树的高,hi为以p为根的二叉树的高,hi最后返回。 height(p) if (1) if(p->lchild=null) lh=(2) ; else lh=(3); if(p->rchild=null) rh=(4); else rh=(5); if (lh>rh) hi=(6);else hi=(7); else hi=(8); return hi; / 答:(1)p (2)0 (3)height(p->lchild) (4)0 (5)height(p->rchild) (6)lh+1 (7)rh+1 (8)0 41已知一棵满二叉树的结点个数为20到40之间的素数,此二叉树的叶子结点有多少个? 答:结点个数在20到40的满二叉树且结点数是素数的数是31,其叶子数是16。 42用一维数组存放的一棵完全二叉树;ABCDEFGHIJKL。请写出后序遍历该二叉树的访问结点序列。 答:HIDJKEBLFGCA 43一棵左右子树均不空的二叉树在先序线索化后,其空指针域数为多少? 答:左右子树均不空的二叉树先序线索化后,空指针域为1个。 44设有正文AADBAACACCDACACAAD,字符集为A,B,C,D,设计一套二进制编码,使得上述正文的编码最短。 45编程求以孩子兄弟表示法存储的森林的叶子结点数。要求描述结构。 题目分析当森林以孩子兄弟表示法存储时,若结点没有孩子,则它必是叶子,总的叶子结点个数是孩子子树上的叶子数和兄弟子树上叶结点个数之和。 typedef struct node ElemType data; /数据域 struct node * firstchild, * nextsibling;/孩子与兄弟域 *Tree; int Leaves (Tree t) /计算以孩子-兄弟表示法存储的森林的叶子数 if(t) if(t->firstchild =null) /若结点无孩子,则该结点必是叶子 return(1+Leaves(t->nextsibling); /返回叶子结点和其兄弟子树中的叶子结点数 else return (Leaves(t->firstchild)+Leaves(t->nextsibling); /孩子子树和兄弟子树中叶子数之和 /结束Leaves 46有n个结点的完全二叉树存放在一维数组A1.n中,试据此建立一棵用二叉链表表示的二叉树,根由tree指向。 BiTree Creat(ElemType A,int i) /n个结点的完全二叉树存于一维数组A中,本算法据此建立以二叉链表表示的完全二叉树 BiTree tree; if (i<=n) tree=(BiTree)malloc(sizeof(BiNode); tree->data=Ai; if(2*i>n) tree->lchild=null;else tree->lchild=Creat(A,2*i); if(2*i+1>n) tree->rchild=null;else tree->rchild=Creat(A,2*i+1); return (tree); /Creat 算法讨论初始调用时,i=1。 47. 以孩子兄弟链表为存储结构,请设计算法求树/森林的深度。 题目分析由孩子兄弟链表表示的树,求高度的递归模型是:若树为空,高度为零;若第一子女为空,高度为1和兄弟子树的高度的大者;否则,高度为第一子女树高度加1和兄弟子树高度的大者。其非递归算法使用队列,逐层遍历树,取得树的高度。 int TreeDepth(CSTree T) if (!T) return 0; else h1= TreeDepth(T->firstchild); h2= TreeDepth(T->nextsibling); return (max(h1+1,h2); / TreeDepth 48. 设计算法返回二叉树T的先序序列的最后一个结点的指针,要求采用非递归形式,且不许用栈。 题目分析二叉树先序序列的最后一个结点,若二叉树有右子树,则是右子树中最右下的叶子结点;若无右子树,仅有左子树,则是左子树最右下的叶子结点;若二叉树无左右子树,则返回根结点。 BiTree LastNode(BiTree bt) /返回二叉树bt先序序列的最后一个结点的指针 BiTree p=bt; if(bt=null) return(null); else while(p) if (p->rchild) p=p->rchild; /若右子树不空,沿右子树向下 else if (p->lchild) p=p->lchild; /右子树空,左子树不空,沿左子树向下 else return(p); /左右子树均为空,p即为所求 /lastnode 49. 设一棵二叉树的根结点指针为T,C为计数变量,初值为0,试写出对此二叉树中结点计数的算法:BTLC。 int BTLC(BiTree T,int *c) /对二叉树T的结点计数 if(T) *c+; /调用时*c=0 BTLC(T->lchild,&c); /统计左子树结点 BTLC(T->rchild,&c); /统计右子树结点 / 50设计算法:统计一棵二叉树中所有叶结点的数目及非叶结点的数目。 void Count(BiTree bt,int *n0,*n) /统计二叉树bt上叶子结点数n0和非叶子结点数n if(bt) if (bt->lchild=null && bt->rchild=null) *n0+;/叶子结点 else *n+; /非叶结点 Count(bt->lchild,&n0,&n); Count(bt->rchild,&n0,&n); /Count 51、编写算法完成下列操作:无重复地输出以孩子兄弟链表存储的树T中的所有的边。输出形式为,其中ki和kj为树结点中的结点标识。 Void OutEdger(CSTree T) /先根遍历输出树中各条边 if (T) p=T->firstchild; while(p) printf(T->data,p->data); OutEdger(p); p=p->nextsibling; / 52、已知Li和Ri分别指示二叉树中第i个结点的左孩子和右孩子结点,0表示空,试写出判别结点u是否是结点v的子孙的算法。 status descendent(int L,int R,int u,int v) if (u&&v) if(Lv=u|Rv=u) return TRUE; else if(descendent(L,R,u,Lv) return TRUE; else return(descendent(L,R,u,Rv); else return FALSE; / 53. 设一棵二叉树以二叉链表为存贮结构,结点结构为(lchild, data,rchild),设计一个算法将二叉树中所有结点的左,右子树相互交换。 类似本题的另外叙述有: 设t为一棵二叉树的根结点地址指针,试设计一个非递归的算法完成把二叉树中每个结点的左右孩子位置交换。 写一个将二叉树中每个结点的左右孩子交换的算法。 void exchange(BiTree bt) /将二叉树bt所有结点的左右子树交换 if(bt) BiTree s; s=bt->lchild; bt->lchild=bt->rchild; bt->rchild=s; /左右子女交换 exchange(bt->lchild); /交换左子树上所有结点的左右子树 exchange(bt->rchild); /交换右子树上所有结点的左右子树 算法讨论将上述算法中两个递归调用语句放在前面,将交换语句放在最后,则是以后序遍历方式交换所有结点的左右子树。中序遍历不适合本题。 下面是本题要求的非递归算法 void exchange(BiTree t) /交换二叉树中各结点的左右孩子的非递归算法 int top=0; BiTree s,p; /s是二叉树的结点指针的栈,容量足够大 if(bt) s+top=t; while(top>0) t=stop-; if(t->lchild|t->rchild)p=t->lchild;t->lchild=t->rchild;t->rchild=p;/交换左右 if(t->lchild) s+top=t->lchild; /左子女入栈 if(t->rchild) s+top=t->rchild; /右子女入栈 /while(top>0) /if(bt) /exchange 54要求二叉树按二叉链表形式存储, 写一个建立二叉树的算法。写一个判别给定的二叉树是否是完全二叉树的算法。 完全二叉树定义为:深度为K,具有N个结点的二叉树的每个结点都与深度为K的满二叉树中编号从1至N的结点一一对应。此题以此定义为准。 题目分析二叉树是递归定义的,以递归方式建立最简单。判定是否是完全二叉树,可以使用队列,在遍历中利用完全二叉树“若某结点无左子女就不应有右子女”的原则进行判断。 BiTree Creat /建立二叉树的二叉链表形式的存储结构 ElemType x;BiTree bt; scanf(“%d”,&x); /本题假定结点数据域为整型 if(x=0) bt=null; else if(x>0) bt=(BiNode *)malloc(sizeof(BiNode); bt->data=x; bt->lchild=creat; bt->rchild=creat; else error(“输入错误”); return(bt); / Creat int JudgeComplete(BiTree bt) /判断二叉树是否是完全二叉树,如是,返回1,否则,返回0 int tag=0; BiTree p=bt, Q; / Q是队列,元素是二叉树结点指针,容量足够大 if(p=null) return (1); QueueInit(Q); QueueIn(Q,p); /初始化队列,根结点指针入队 while (!QueueEmpty(Q) p=QueueOut(Q); /出队 if (p->lchild && !tag) QueueIn(Q,p->lchild); /左子女入队 else if (p->lchild) return 0; /前边已有结点为空,本结点不空 else tag=1; /首次出现结点为空 if (p->rchild && !tag) QueueIn(Q,p->rchild); /右子女入队 else if (p->rchild) return 0; else tag=1; /while return 1; /JudgeComplete 算法讨论完全二叉树证明还有其它方法。判断时易犯的错误是证明其左子树和右子数都是完全二叉树,由此推出整棵二叉树必是完全二叉树的错误结论。

    注意事项

    本文(数据结构第六章习题课.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开