1、 3.3.1.1.2局部数据结构 . . . . . . . . . . . . . . . 4 3.3.1.4算法及程序说明. . . . . . . . . . . . . . 4 3.3.1.5接口设计. . . . . . . . . . . . . . . . . . 6 3.3.2子功能模块2 . . . . . . . . . . . . . . . . . 7 3.3.3子功能模块3 . . . . . . . . . . . . . . . . . . . 8 3.3.4子功能模块4 . . . . . . . . . . . . . . . . . . . 9 3.3.5子
2、功能模块5 . . . . . . . . . . . . . . . . . . . 103.4运行结果 . . . . . . . . . . . . . . . . . . . 123.5尚未解决的问题 . . . . . . . . . . . . . . . . . . 121.题目 二叉链表的基本操作2.要求设二叉树以二叉链表的形式保存,T为指向根结点的指针。试完成以下功能:1、建立二叉树:从键盘输入各结点的值,可参照二叉树的顺序存储方式。例如输入“a,b,c, ,d”表示结点a是根,b和c是a的两个孩子,b仅有右孩子d。2、统计T中叶结点的个数。3、统计T中度为2的结点的个数。4
3、、求树T的高度。 5、判断T中是否有度为1的结点(即按照国外教材的定义,是否为满树)。3.程序实现 3.1程序运行及编译环境程序是用Visual Studio 2008即VS9.0 编译的。可以在windows系列的操作系统上运行。 3.2程序描述该程序主要用于构造参考二叉链表的顺序存储结构。其流程如下:A).构造树控制台输入字符,依此构造二叉树的每一个节点B).输出这棵树的信息C).完成3.3实现功能Main BinTree bt; bt.CreateTree();/建树 bt.GetInfo(bt.getRoot();/获取信息,包括度为0,1,2节点数等 system(pause); r
4、eturn 0;3.3.1子功能模块1 /*函数原型:void Convert2Bin(int num,bool a,int& idx);函数功能:把一个十进制数转化为二进制数参数含义:num:要转化的十进制数;bool a:为节省空间,采用bool型来存储二进制的每一位用idx表示*/ idx)/把一个整数num转化为二进制的形式,存放在数组a里面,idx存放输出到数组的哪一项 int i=0; bool temp; while(num1) /除2取余,得到逆序的二进制序列 ai+=num%2; num/=2; ai=num; idx=i; for (int j=0;j(idx+1)/2;j
5、+)/把逆序的变为正序的 temp=aj; aj=aidx-j; aidx-j=temp;3.3.1.1数据结构的定义3.3.1.1.1全局数据结构 全局数据结构有: typedef struct BinNode/树的结点 data dat;/节点的数据域 BinNode* left;/左孩子 BinNode* right;/右孩子 int height;/树高;class BinTree BinNode* root;/树的根节点,依此表示一棵树public: BinTree(); BinNode* getRoot(); void AddNode(data Data,int idx); voi
6、d Traversal(BinNode* Root); void CreateTree(); void GetInfo(BinNode* Root);3.3.1.1.2 局部数据结构 无。3.3.1.4算法及程序说明A).本程序最重要的是用二叉链表来实现树的顺序存储: 基于此,要实现树的顺序存储,树就必须有一个存储的依据,即何为“顺序”?顺序就是按照控制台输入的顺序插入,因此,它所代表的字母的序号就是它的顺序,而这个序号决定着它唯一的存储位置。由序号到二叉链表的位置,只要把序号转化为二进制的数字序列,然后去掉最高位1,得到的二进制序列就是从根节点到该结点的路径,其中0表示左子树,1表示右子树。
7、B).算法代码如下:/*void InsertOrder(int num,bool a,int&由一个十进制数决定插入二叉树的顺序 如传入的num是9,则a=0,0,1则表示往左,左,右的顺序 idx) Convert2Bin(num,a,idx); for (int i=0;idat=Data; return; bool orderMAXSIZE;/orderMAXSIZE用来存放插入的顺序,则order=0,0,1则表示往左,左,右的顺序,count表示前多少位有效 int count=0; InsertOrder(idx,order,count);/由序号得到插入的顺序 root-hei
8、ght=count+2;/树高就是位数加1 BinNode* binNode=new BinNode;/生成一个结点 BinNode* temp=root; binNode-left=NULL;right=NULL; for (int i=0;count;i+)/按照路径插入 switch (orderi) case true: temp=temp-right; break; case false:left; default: coutright=binNode:left=binNode;/最后一步3.3.3子功能模块3void Traversal(BinNode* Root)/递归遍历 if
9、(Root) Traversal(Root-left); coutdat;right);3.3.4子功能模块4/*从控制台输入数据,然后构造一棵树附加说明:输入的字符串要以#结束,逗号分隔,如a,b,c,d#*/ void CreateTree() cout if (Root-left=NULL&right=NULL)/度为0的节点 Node0+; if (Root-left!=NULL&right=NULL)|(Root-right!=NULL)/度为1的节点 Node1+;=NULL)/度为2的节点 Node2+; if(Root=root)/后序遍历,到达根节点时,完成遍历因为这是一个参考顺序存储的数据结构,所以最后一个结点的深度就是树的高度,所以树高为root-height度为2的结点数Node2度为1的结点数Node1度为0的结点数Node0 if(Node0=0)由于度为0的结点个数为0,所以这是一颗满树!3.4运行结果图1 程序运行结果截图 生成的树是a,b,c,d,e,f,g,h,i,j,e,r3.5尚未解决的问题暂时没有发现。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1