南邮数据结构上机实验二二叉树基本操作与哈夫曼编码译码系统实现

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

实验报告

(2015 / 2016学年第二学期)

课程名称

数据结构A

实验名称二叉树的基本操作及哈夫曼编码译码系统的实现

实验时间2016 年 4 月14 日

指导单位计算机科学与技术系

指导教师骆健

学生姓名班级学号

学院(系) 管理学院专业信息管理与信息系统

实习题名:二叉树的基本操作

班级姓名学号日期2016.04.14

一、问题描述

设计递归算法,实现下列二叉树运算:删除一棵二叉树、求一棵二叉树的高度、求一棵二叉树中叶子结点数、复制一棵二叉树、交换一棵二叉树的左右子树。设计算法,按自上到下,从左到右的顺序,按层次遍历一棵二叉树。设计main函数,测试上述每个运算。

二、概要设计

文件tree.cpp中在该文件中定义二叉树的链式存储结构,用队列实现二叉树的层次遍历,并且编写实现二叉树的各种基本操作函数。其中包括结点类BTNode,循环队列类SeqQueue,二叉树类BinaryTree。

主函数main的代码如图所示。

三、 详细设计

1. 类和类的层次设计

程序定义了循环队列SeqQueue 类和二叉树BinaryTree 类。SeqQueue 类主要是用队列实现,层次遍历。运用后序遍历思想,把树分解为左右子树和跟结点再进行左右交换并计算树的高度,最后删除二叉树。

(a )循环队列类

SeqQueue

-int front, rear; -int maxSize; -BTNode **q;

+SeqQueue(int mSize); +~SeqQueue(){delete []q;}

+bool IsEmpty() const{return front == rear;}

+bool IsFull() const{return (rear + 1) % maxSize == front;}

+bool Front(BTNode *&x)const; +bool EnQueue(BTNode *x); +bool DeQueue();

+void Clear(){front = rear = 0;}

T T

(b)二叉树类

2.核心算法

程序利用循环队列SeqQueue类通过不断出队并输出节点的值,将左右孩子入队直到队列为空实现二叉树的层次遍历。并运用后序遍历思想,将二叉树树分解为左右子树和根结点,利用(p -> lChild)和(p -> rChild)计算结点数目,并通过交换结点的左右子树实现左右交换,计算树的高度,最后删除二叉树。核心算法主要是二叉树BinaryTree类中的High,Node_num,Exchange,Level_traversal四个函数,其设计流程图如下:

High()

Node_num()

BinaryTree

+BinaryTree():s(100){root = NULL;}

+~BinaryTree(){delete []root;}

+bool Clear();

+void MakeTree(constT&x,BinaryTree&left,BinaryTree&

right);

+int High(BTNode*p);

+int Node_num(BTNode*p);

+BTNode*Copy (BTNode*t);

+void Exchange(BTNode *&t);

+void Level_traversal(void(*Visit)(T&x));

#SeqQueue s;

-void Clear(BTNode* &t);

-void Level_traversal(void(*Visit)(T&x),BTNode*t);

Exchange()

Level_traversal() 四、程序代码

template

int BinaryTree::Node_num(BTNode*p) //叶子结点

{

if(p)

{

if(p -> lChild == NULL && p -> rChild == NULL)

return 1;

else

return Node_num(p -> lChild) + Node_num(p -> rChild);

}

else

return 0;

}

template

void BinaryTree::Exchange(BTNode*&t) //左右子树交换

{

if(t)

{

BTNode*q = t -> lChild;

t -> lChild = t->rChild;

t -> rChild = q;

Exchange(t -> lChild);

Exchange(t -> rChild);

}

}

template

void BinaryTree::Level_traversal(void(*Visit)(T&x)) //层次遍历

{

Level_traversal(Visit, root);

cout << endl;

}

template

void BinaryTree::Level_traversal(void(*Visit)(T&x),BTNode*t) //层次遍历

{

BTNode *a;

Visit(t -> element);

if(t -> lChild)

s.EnQueue(t -> lChild);

if(t -> rChild)

s.EnQueue(t -> rChild);

while(s.Front(a) == true)

{

if(a -> lChild)

s.EnQueue(a -> lChild);

if(a -> rChild)

s.EnQueue(a -> rChild);

Visit(a -> element);

s.DeQueue();

}

}

五、测试和调试

1.测试用例和结果

测试结果如下图

2.结果分析

1)程序能够正确的实现二叉树的基本的建立、删除、复制、遍历以及结点计算等基本操作。

相关文档
最新文档