数据结构习题解析与实训 第六章.doc
《数据结构习题解析与实训 第六章.doc》由会员分享,可在线阅读,更多相关《数据结构习题解析与实训 第六章.doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章 树和二叉树这一章的重点是二叉树。通过本章的习题可以在机器上运行程序,以验证二叉树的各种遍历算法和在二叉树上的各种操作,包括二叉树左右子树交换、求二叉树叶子结点个数、求二叉树的深度、求某结点的双亲结点等。二叉树的存储结构采用二叉链表,结构如下所示。#defineDATATYPE2chartypedefstructnode1DATATYPE2data;structnode1lchild,rchild;BTCHINALR;要实现在二叉树上的各种操作,首先应将二叉树以上述的二叉链表结构在内存中建立起来,而后在其上面进行各种操作。下面提供一个建立二叉树的函数,供各应用程序调用,函数源程序以“二叉
2、树.c”为名放在光盘上。“二叉树.c”源代码如下所示。BTCHINALRcreatebt()BTCHINALRq;structnode1s50;intj,i,x;printf(建立二叉树,输入结点对应的编号和值nn);printf(i,x=);scanf(%d,%c,&i,&x);while(i!=0&x!=)q=(BTCHINALR)malloc(sizeof(BTCHINALR);/建立一个新结点q/q-data=x;q-lchild=NULL;q-rchild=NULL;si=q;/q新结点地址存入s指针数组中/if(i!=1)/i=1,q结点是根结点/j=i/2;/否则求q结点的双亲结
3、点的编号j/l62数据结构习题解析与实训if(i%2=0)sj-lchild=q;/q结点编号为偶数则挂在双亲结点j的左边/elsesj-rchild=q;/q结点编号为奇数则挂在双亲结点j的右边/printf(i,x=);scanf(%d,%c,&i,&x);returns1;/返回根结点地址/下面举例说明二叉树的建立。设有一棵二叉树如图61(a)所示,将二叉树模拟为完全二叉树从根开始对结点进行编号,编号从1开始,结果如图61(b)所示。在运行过程中要求输入结点对应的编号和值时,请按图61(c)中的数据输入,最后以编号i=0;结点值x=结束。图6.1二叉树的建立6.1习题解析【习题1】二叉树
4、中序遍历题目要求:对建立的二叉树进行中序遍历,并输出遍历结果。中序遍历算法可以用递归算法实现,也可以用非递归算法实现。建立二叉树的函数放在“二叉树.c”源程序中。以下各例中均如此。【解答】#include#includedatastru.h#include#include二叉树.cvoidinorder(BTCHINALRbt)/中序遍历二叉树(递归算法)/if(bt!=NULL)inorder(bt-lchild);第6章树和二叉树l63printf(%c,bt-data);inorder(bt-rchild);voidinorder_notrecursive(BTCHINALRbt)/中序
5、遍历二叉树(非递归算法)/BTCHINALRq,s20;inttop=0;intbool=1;q=bt;dohile(q!=NULL)top+;stop=q;q=q-lchild;if(top=0)bool=0;elseq=stop;top-;printf(%c,q-data);q=q-rchild;while(bool);main()TCHINALRbt;charch;inti;bt=createbt();i=1;whil(i)printf(n中序遍历二叉树(递归按y键,非递归按n键):);fflush(stdin);scanf(%c,&ch);if(ch=y)inorder(bt);els
6、einorder_notrecursive(bt);printf(n);printf(n继续操作吗?(继续按1键,结束按0键):);fflush(stdin);scanf(%d,&i);【习题2】求二叉树叶子结点数题目要求:计算二叉树叶子结点数。计算二叉树叶子结点数的算法很多,既可用递归算法实现,也可用非递归算法实现。该例用递归算法实现。【解答】#include#includedatastru.hl64数据结构习题解析与实训#include#include二叉树.cintleaf(BTCHINALRbt)if(bt=NULL)return0;elsef(bt-lchild=NULL&bt-rc
7、hild=NULL)return1;elsereturn(leaf(bt-lchild)+leaf(bt-rchild);main()TCHINALRbt;intleafnum;bt=createbt();leafnum=leaf(bt);printf(n二叉树的叶子结点数=%dnn,leafnum);【习题3】求二叉树深度题目要求:计算二叉树深度,树根为第一层。【解答】#include#includedatastru.h#include#include二叉树.cinttreehight(BTCHINALRbt)intlh,rh,h;if(bt=NULL)h=0;elseh=treehight
8、(bt-lchild);rh=treehight(bt-rchild);h=(lhrh?lh:rh)+1;returnh;main()TCHINALRbt;inttreeh;bt=createbt();treeh=treehight(bt);第6章树和二叉树l65printf(n二叉树深度=%dnn,treeh);【习题4】二叉树左右子树交换题目要求:从二叉树的根结点开始,将每一个结点的左右子树交换。为验证算法的正确性,程序将显示交换前及交换后的二叉树的中序遍历结果。二叉树左右子树交换算法用递归算法实现。前面图61(a)例举的二叉树在运行本算法后的新二叉树如图62所示。运行过程如图63所示。图
9、6.2更新的二叉树图6.3二叉树左右子树交换运行过程【解答】#includedatastru.h#include#include#include二叉树.cl66数据结构习题解析与实训BTCHINALRchange(BTCHINALRbt)/二叉树左右子树交换递归算法/BTCHINALRp;if(bt!=NULL)if(bt-lchild!=NULL|bt-rchild!=NULL)p=(BTCHINALR)malloc(sizeof(BTCHINALR);p-data=bt-data;p-rchild=NULL;p-lchild=bt-lchild;bt-lchild=bt-rchild;bt
10、-rchild=p-lchild;bt-lchild=change(bt-lchild);bt-rchild=change(bt-rchild);returnbt;voidinorder(BTCHINALRbt)/中序遍历二叉树(递归算法)/if(t!=NULL)inorder(bt-lchild);printf(%c,bt-data);inorder(bt-rchild);main()BTCHINALRbt;bt=createbt();printf(n二叉树左右子树交换前中序遍历:);inorder(bt);printf(n);bt=change(bt);printf(n二叉树左右子树交换后
11、中序遍历:);inorder(bt);printf(n);【习题5】查找给定结点题目要求:设二叉树中结点值互不相同,即各值具有惟一性。输入一给定值,确定给定值对应的结点是否在二叉树中存在。第6章树和二叉树l67【解答】#includedatastru.h#include#include#include二叉树.cBTCHINALRsearch_ch(BTCHINALRcur,charx)/先序查找/BTCHINALRtemp;if(cur=NULL)returnNULL;if(x=cur-data)returncur;temp=search_ch(cur-lchild,x);if(temp!=N
12、ULL)returntemp;elsereturnsearch_ch(cur-rchild,x);main()TCHINALRbt,p;charch;inti;bt=createbt();fflush(stdin);i=1;while(i)printf(输入待查结点数据:);scanf(%c,&ch);p=search_ch(bt,ch);if(p=NULL)printf(无此结点nn);elseprintf(结点存在nn);printf(n继续操作吗?(继续按1键,结束按0键):n);fflush(stdin);scanf(%d,&i);fflush(stdin);printf(n);【习题
13、6】查找给定结点的双亲结点题目要求:实现此功能是基于上一算法的基础,当确定给定结点存在二叉树中,则输出该结点的双亲结点;如果给定结点是根结点,则给出相应的提示信息。【解答】#includedatastru.h#include#include#include二叉树.cBTCHINALRsearch_ch(BTCHINALRcur,charx)l68数据结构习题解析与实训/先序查找:在以cur为根的子树中查找值为x的结点是否存在/BTCHINALRtemp;if(cur=NULL)returnNULL;if(x=cur-data)returncur;temp=search_ch(cur-lchil
14、d,x);if(temp!=NULL)returntemp;elsereturnsearch_ch(cur-rchild,x);BTCHINALRparent(BTCHINALRstart,BTCHINALRcurrent)/从start所指结点起查找当前结点current的父亲结点/BTCHINALRp;if(start=NULL)returnNULL;if(start-lchild=current|start-rchild=current)returnstart;p=parent(start-lchild,current);if(p!=NULL)returnp;elsereturnpare
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构习题解析与实训 第六章 数据结构 习题 解析 第六
限制150内