- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE
PAGE 10
目录
TOC \o 1-3 \h \z \u 一 需求分析 2
二 概要设计 2
三 详细设计 3
四 调试分析和测试结果 5
五 总结 7
六 参考文献 8
七 致谢 8
八 附录 8
一 需求分析
问题描述:交换二叉树中所有结点的左、右子树,该二叉树以二叉链表作为存储结构。
基本思想:设二叉树的根指针为s,且以二叉链表表示,可利用一个类型为Q的指针队列来实现,且设队列单元包含两个域,一个为front,一个为rear,整个队列容量为maxsize,当树非空时,将当前的树根结点入队列,同时将当前队列顶元素出队列当作根结点,然后依据当前的根结点是否具有孩子结点来判定是否将其左、右指针进行交换;再将交换后的左指针或右指针入队列,这样反复进行,直到队列空为止。
图1-1是该课题的功能模块图:
二叉树结点的左、右子树的交换
二叉树结点的左、右子树的交换
重新建立二叉树
交换左右子数
先根遍历二叉树
退出
图 1-1
二 概要设计
该课题主要分为三个功能模块:重新建立二叉树、交换左右子数、先根遍历二叉树。这里主要用到了队列及二叉树的知识,先对二叉树进行层次遍历,然后再进行左右子树交换操作,最后再进行先根遍历二叉树,这就实现了二叉树节点的左右子树交换。三个功能模块相互独立又相互关联,独立仅在于各自操作互不影响,而关联在于后两个功能可以对当前建立的二叉树进行操作,产生不同的结果。
该功能流程图(图2-1)如下:
开 始
开 始
输入二叉树的节点(以“!“结束)
enter
重新建立二叉树
交换左右子数
先根遍历二叉树
菜 单
2
1
3
0
结 束
图2-1
三 详细设计
本课题为二叉树结点的左、右子树的交换,主要分为三个模块:重新建立二叉树、交换左右子数、先根遍历二叉树。各模块的详细设计如下:
首先定义结构体类型及二叉树结点类型,如下所示:
typedef char datatype; // 树的结点数据类型为字符型,可以根据需要修改
typedef struct node *pointer; // 定义二叉树结点类型
struct node {
datatype data; //结点数据
pointer lchild,rchild; //左右孩子结点
};
三个模块各写三个函数,分别如下所示:
bitree level_creat() //由层次序列建立二叉树,返回根指针
{
char ch;
ch=cin.get();
int front,rear;
pointer root,s;
root=NULL; //置空二叉树
front=rear=0; //置空队列
//while(cinch,ch!=!)
while(cinch,ch!=!)
{
if(ch!=@) //非虚结点,建立新结点
{
s=new node;
s-data=ch;
s-lchild=s-rchild=NULL;
}
else s=NULL;
rear++;
Q[rear]=s; //不管结点是否为虚都要入队
if(rear==1) { root=s; front=1; } //第一个点是根,要修改头指针,他不是孩子
else if(s Q[front]) //孩子和双亲都不是虚结点
if(rear%2==0) Q[front]-lchild=s; // rear是偶数,新结点是左孩子
else
{
Q[front]-rchild=s; //rear 是奇数,新结点是右孩子
front++;
}
}
return root;
}
void exchange(bitree t) //交换左右子数函数
{
pointer p;
if(t==NULL) return; //空树,直接返回
p=t-lchild; t-lchild=t-rchild; t-rchild=p; //交换
exchange(t-rchild); //遍历原左子树
exchange(t-lchild); //遍历原右子树
}
void preorder(bitree t) //先根遍历函数
{
if(t==NULL)
return;
coutt-data ; //先访问跟
preorder(t-lchild); //先根遍历左子树
preorder(t-rch
文档评论(0)