江苏大学数据结构上机实验报告

2018-12-06 21:22

上机实验报告

课程名称: 数据结构A 实验题目: 二叉树操作 专业班级: 计算机1501 学 号: 3150602020 姓名: 经普杰 完成日期: 2016.11.1 成 绩:

实验内容、目的和要求

(一) 实验内容

二叉树的建立和遍历。

(二) 实验目的

1. 进一步掌握指针变量的使用。

2. 掌握二叉树的结构特征以及各种存储结构的特点及使用范围。 3. 掌握用指针类型描述、访问和处理二叉树的运算。

4. 掌握栈或队列的使用。

(三) 实验要求

本实验要求实现以下功能:

1. 按前序次序建立一棵二叉树,以‘#’表示空。 2. 中序、后序遍历该二叉树,输出遍历序列。

3. 求出该二叉树的深度并输出,或求出该二叉树的叶子数目并输出。

4. 试以栈为辅助存储结构实现二叉树的前序非递归算法或以队列为辅

助存储结构实现二叉树的层次遍历算法。

程序中使用的数据结构及符号说明

主要使用了

While循环语句 for循环语句 二叉树链表的建立 对二叉树的遍历 计算二叉树的高度 计算叶子节点的数量

程序的主要流程图

程序主要模块的功能说明

本程序分为四个类建立,分别为node类,linkqueue类,bintreenode类,bintreelink类 四个类中

node类:定义一个普通节点类,用于构建队列类

Linkqueue类:这是一个队列类,用于进行二叉链表的层次遍历,将二叉链表中的数据入队再出队以达到层次遍历的目的。

Bintreenode类:是建立一个二叉链表节点类,建立这样一个类,组成二叉链表。即二叉链表是由多个二叉链表类节点组合而成的。这个类中应包括,二叉树中的一个节点的全部内容,包括数据data,左子树leftchild,右子树rightchild,其中操作是对bintreenode进行初始化。 Bintreelink类:是整个程序的主要部分,这是一个二叉链表类,这个类由多个二叉链表类节点组成,这个链表即为二叉树的体现,在这个类中,包括对二叉树的操作。首先,定义数据成员:二叉树根节点。包括一系类对二叉链表的操作的函数成员:preorder(先序遍历)inorder(中序遍历),postorder(后续遍历),levelorder(层次遍历)height求二叉树的高度,leaf求二叉树叶子节点数。

程序运行时的初值和运行结果

【测试数据】

输入以下字符串,建立二叉树:ABC##DE#G##F### 输出中序遍历序列应为:CBEGDFA 输出后序遍历序列应为:CGEFDBA 输出二叉树的深度应为:5 输出二叉树的叶子数目应为:3

收获及体会

通过本次二叉树操作的实验,我基本了解了如何建立二叉树,二叉树的遍历操作,

求二叉树的高度,叶子节点数,将树上的一些伪代码算法实现为真正的c++算法,使我更加了解这些算法操作的含义。同时分清了二叉树链表节点类和二叉链表类之间的关系,明确对二叉链表的操作应该体现在二叉链表类中,二叉链表又是由二叉链表节点构成。了解了二叉链表的先序,中序,后序遍历在代码上的区别。

但是在这次实验中,发现自己对c++语言仍较为生疏,编写代码的方式不够程序,导致语言不规范,带来了许多不必要的麻烦,例如在建立二叉树的函数中,有一段代码为 If(ch==“#”)r=NULL;在开始的时候我错误的写成了If(ch=“#”)r=NULL;导致程序不能正常输入,只输入一个数据,程序就自动跳出循环,我在这个问题上多次检查,即使发现了问题出现在建立二叉树时,对代码多次检查都没有发现这个细小的错误,导致浪费了大量时间。

同时发现自己对二叉树的建立也不是很清楚,不知该如何下手,是通过百度 csdn等途径得知,不过对于遍历方面理解尚可。

源程序 Bintreenode.h

#pragma once #include using namespace std; class bintreenode { public: };

char data;

bintreenode*leftchild; bintreenode*rightchild; bintreenode();

bintreenode(char d, bintreenode*lchild, ~bintreenode();

#pragma once #include #include\#include%using namespace std; class bintreelink { public:

bintreenode*r; bintreelink(); ~bintreelink();

void creatbitree(bintreenode*&r); void preorder(bintreenode*r); void Inorder(bintreenode*r); void postorder(bintreenode*r); int height(bintreenode*r); int leaf(bintreenode*r); public:

#include \bintreenode::bintreenode() { }

bintreenode::bintreenode(char d,

leftchild = rightchild = NULL;

bintreenode*lchild, bintreenode*rchild) {

data = d;

leftchild = lchild; rightchild = rchild;

}

Bintreelink.h

public:

bintreenode*rchild);

Bintreenode.cpp

void levelorder(bintreenode*r); };

Bintreelink.cpp

#include \

bintreelink::bintreelink() { r = NULL;

}

bintreelink::~bintreelink() { } void

bintreelink::creatbitree(bintreenode*&r) { char ch;

cout<<\请输入数据\ cin >> ch; if (ch == '#') r = NULL; else { r =new bintreenode; r->data = ch;

creatbitree(r->leftchild);

creatbitree(r->rightchild); }

}

void bintreelink::preorder(bintreenode*r) { if (r != NULL) { cout << r->data << \ preorder(r->leftchild); preorder(r->rightchild); }

}

void bintreelink::Inorder(bintreenode*r)//中序遍历 {

if (r != NULL) { Inorder(r->leftchild); cout << r->data << \ Inorder(r->rightchild);

}

}

void bintreelink::postorder(bintreenode*r)//后序遍历 { if (r != NULL) { postorder(r->leftchild); postorder(r->rightchild); cout << r->data << \

}

}

int bintreelink::height(bintreenode*r) //求二叉树的高度 { int lh = 0, rh = 0; if (r == NULL) return 0; else

{ lh = 1 + height(r->leftchild); rh = 1 + height(r->rightchild); }

return lh > rh ? lh : rh;

}

int bintreelink::leaf(bintreenode*r) //求二叉树的叶子节点数 {

// int count = 1; if (r == NULL) return 0; else

{ if ((r->leftchild == NULL)&&(r->rightchild==NULL))

return 1; else

{

int left, right;


江苏大学数据结构上机实验报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:调研报告:关于全市职业教育发展和改革的调查研究

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: