实验二 根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树教学提纲

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二根据二叉树的抽象数据类型的定义,使用二叉链表实现一

个二叉树

数据结构实验报告

实验名称:实验二——根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树

学生姓名:郭江枫

班级: 2017211125

班内序号: 10

学号: 2017210722

日期: 2018年5月24日

1.实验要求

根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树

基本要求:

根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。

二叉树的基本功能:

1、二叉树的建立

2、前序遍历二叉树

3、中序遍历二叉树

4、后序遍历二叉树

5、按层序遍历二叉树

6、求二叉树的深度

7、求指定结点到根的路径

8、二叉树的销毁

9、其他:自定义操作

编写测试main()函数测试线性表的正确性

2. 程序分析

2.1 存储结构

编码表存储结构:二叉树

二叉树结点结构:

template

struct node//定义结点

{

T data;//数据

node*lch;//左孩子

node*rch;//右孩子

};

2.2 关键算法分析

实现该项目需要有如下步骤:

步骤一:创建二叉树

步骤二:前序遍历

步骤三:中序遍历

步骤四:后序遍历

步骤五:层序遍历

步骤六:计算树的深度

步骤七:求指定结点到根的路径

步骤八:二叉树的销毁

步骤一:根据顺序存储结构和性质5,可知如果当前节点的位置为i,则

左孩子位置为2i,右孩子为2i+1.所以,创建二叉树以顺序存储结构为输入,采

用先建立根结点,再建立左右孩子的方法递归建立二叉链表的二叉树。

template

void creat(node*&R, T data[], int i, int n)//创建二叉树

{

if (i <= n&&data[i - 1])//如果n个数据没有存储完并且数据不为空

{

R = new node;//定义一个新结点

R->data = data[i - 1];//将第i个数据赋给R的data

creat(R->lch, data, 2 * i, n);//递归,建立左子树

creat(R->rch, data, 2 * i + 1, n);//递归,建立右子树

}

else R = NULL;//如果不满足,则为空

}

步骤二:由二叉树的前序遍历定义,结合递归,写出前序遍历的递归算

法。

template

void preorder(node*R)//前序遍历

{

if (R != NULL)//如果R不为空,则执行以下操作

{

cout << R->data;//输出R的数据

preorder(R->lch);//遍历左子树

preorder(R->rch);//遍历右子树

}

} 步骤三:由二叉树的中序遍历定义,结合递归,写出中序遍历的递归算

法。

template

void inorder(node*R)//中序遍历

{

if (R != NULL)//如果R不为空,则执行以下操作

{

inorder(R->lch);//遍历左子树

cout << R->data;//输出R的数据

inorder(R->rch);//遍历右子树

}

}

步骤四:由二叉树的后序遍历定义,结合递归,写出后序遍历的递归算法。

template

void postorder(node*R)//后序遍历

{

if (R != NULL)//如果R不为空,则执行以下操作

{

postorder(R->lch);//遍历左子树

postorder(R->rch);//遍历右子树

cout << R->data;//输出R的数据

}

}

步骤五:在进行层序遍历时,对某一层的结点访问完毕后,在按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先访问的结点其左右孩子也要先访问,这与队列的特性比较吻合。因此,我们可以利用队列来实现二叉链表的层序遍历。

template

void levelorder(node*R)//层序遍历

{

node*queue[1000];

int f = 0, r = 0;//初始化空队列

if (R != NULL)

queue[++r] = R;//根结点入队

while (f != r)

{

node*p = queue[++f];//队头元素出队

cout << p->data;//输出队头元素

if (p->lch != NULL)

queue[++r] = p->lch;//如果左子树不为空,则将左子树元素入队

if (p->rch != NULL)

queue[++r] = p->rch;//如果右子树不为空,则将右子树元素入队

}

}

相关文档
最新文档