- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构二叉链表C实现
实 验 报 告
实验目的
掌握二叉树的数据类型描述及二叉树的特性。
掌握二叉树的链式存储结构(二叉链表)的建立算法。
掌握二叉链表上二叉树的基本运算的实现。
实验内容
实现二叉树的层次递进。
将一颗二叉树的所有左右子树进行交换。
实验与算法分析
二叉树的遍历
二叉树的层次遍历采用的是队列。本题用一个一维数组来代替队列,同时设置队列的对头指针和队尾指针。
算法分析:自定义3个函数:结构 struct bitree;建立二叉链表的函数 bitree *create();按层次遍历二叉链表的函数 void lorder(bitree *t)。
结构 struct bitree 中包括数据域和两个指针域(一个指向左孩子,另一个指向右孩子)。
建立二叉链表的函数 bitree *create() 中先建立一个空队列(条件是front=1,rear=0)。 然后建立二叉链表,用一个一维数组来代替队列,存放输入的结点;输入结点时,必须按照完全二叉树的形式输入;如果非完全二叉树,则必须给定一些假象结点(虚结点),使之完全符合完全二叉树形式。当我们输入“,”时表示虚结点(结点不存在);输入结点值时,存在的结点则输入它对应的字符;最后以一个特殊字符“#”作为输入的结束,表示二叉链表已经完成。
层次遍历二叉链表的函数 void lorder(bitree *t) 中遍历结束条件为头指针下标大于尾指针下标。
将一棵二叉树的所有左右子树进行交换
建立二叉树及先序void preorder(bitree *root)、中序void inorder(bitree *root)、后序void postorder(bitree *root)3种遍历算法都写成子函数,然后分别在子函数中调用。然后再建立一个实现左右子树交换的函数void leftTOright( bitree *r)。左右子树交换的遍历算法为:若二叉树为空,算法结束;否则:交换左子树的左子树和右子树;交换右子树的左子树和右子树;交换左子树和右子树的位置。
最后,是程序的主函数main(),它包含 建立二叉链表,输出交换前二叉树的先序、中序、后序的结果,输出交换后 二叉链表的先序、中序、后序的遍历结果。输出前后结果,方便比较顺序变化。
可执行程序及注释
二叉树层次遍历
#include iostream.h
typedef char elemtype;
struct bitree
{
elemtype data;
bitree *lchild,*rchild;
};
bitree *create() //建立二叉连表
{
bitree *q[100]; //定义q数组作为队列存放二叉链表中的结点,100为最大容量
bitree *s; //二叉链表中的结点
bitree *root; //二叉链表的根指针
int front=1,rear=0; //定义队列的头指针、尾指针
char ch; //结点的data域值
root=NULL;
cout请输入结点值(不存在的结点用‘,’表示,‘#’表示结束)endl;
cinch;
while(ch!=#) //输入值为#号,算法结束
{
s=NULL;
if(ch!=,) //输入数据不为逗号,表示不为虚结点,否则为虚结点
{
s=new bitree;
s-data=ch;
s-lchild=NULL;
s-rchild=NULL;
}
rear++;
q[rear]=s; //新结点或虚结点进队
if(rear==1)
root=s;
else
{
if((s!=NULL)(q[front]!=NULL))
{
if(rear%2==0) //rear为偶数,s为双亲左孩子
q[front]-lchild=s;
else //rear为奇数,s为双亲右孩子
q[front]-rchild=s;
}
if(rear%2==1)
front++; //出队
}
cinch;
}
return root;
}
void lorder(bitree *t) //按层次遍历二叉树
{
bitree *q[100],*p; //q代表队列
int f,r; //f、r类似于队列头指针、尾指针
q[1]=t;
f=r=1;
cout按层次遍历二叉树的结果为:;
while (f=r)
{
p=q[
文档评论(0)