二叉树层次遍历

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

算法与数据结构设计报告

( 2012 / 2013 学年第二学期)

题目:二叉树的层次遍历

专业计算机科学与技术

学生姓名

班级学号

指导教师

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

日期 2013年6月3日

一、课题名称

课程设计题目3:二叉树的层次遍历

二、课题内容和要求

设计要求:任意选定一棵至少含有8个结点的二叉树,编程实现:

(1)按层次遍历算法遍历该二叉树,并给出遍历结果;

(2)利用层次遍历算法显示所有叶结点。

(3)具体设计要求:

I.用队列存储二叉树结点。

II.算法实现层次遍历。

三、需求分析

树型结构是一类重要的非线性数据结构,其中二叉树最重要。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构够可以用树来形象表示。树在计算机领域中也得到了广泛应用,如在编译程序中,可以用树来表示源程序的语法结构。二叉树是一种非线性数据结构,对它进行操作时总需要对每个数据逐一进行操作,这样就存在一个操作顺序问题,由此提出了二叉树的遍历操作问题,所谓遍历二叉树就是按某种顺序访问二叉树中某个结点一次且仅一次的过程,这里的访问可以是输出.比较.更新.查看元素内容等各种操作。本程序要求层次遍历算法遍历一棵至少含有8个结点的二叉树,并给出遍历结果。利用层次遍历算法显示所有叶结点。

【队列部分】

用队列存储二叉树结点。

【层次遍历模块】

算法实现层次遍历。并给出遍历结果。

【结点访问模块】

访问所有叶子结点,并显示所有叶结点。

四、概要设计

在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变量和成员函数原型声明)。

【主函数流程图】

【层次遍历算法】

采用队列存储结点是结合层次遍历二叉树和队列“先进先出”的特点综合考虑的,因为层次遍历即从上到下从左到右依次遍历二叉树结点,而队列恰好可以从上到下从左到右顺序进队然后顺序出队,符合设计的要求。

【节点访问模块】

通过寻找结点是否有左孩子或右孩子来实现对于结点是否为叶子结点。再将访问得到的叶子结点输出。

五、详细设计

【二叉树节点类】

struct BTNode

{

BTNode(){ lChild=rChild=NULL;}

BTNode(const T& x)

{

element=x; lChild=rChild=NULL;

}

BTNode(const T& x,BTNode* l,BTNode* r)

{

element=x; lChild=l; rChild=r;

}

T element;

BTNode* lChild,*rChild;

};

【二叉树类】

class BinaryTree

{

public:

static int total;

BinaryTree() {root=NULL;}

~BinaryTree(){Clear(root);};

bool IsEmpty()const;

bool Root(T& x)const;

void MakeTree(const T& x,BinaryTree& left,BinaryTree& right);

void BreakTree(T& x,BinaryTree& left,BinaryTree& right);

int Depth();

int leaves();

BTNode * GetRoot();

void Exchange();

void InputRoot(BTNode * t);//更好的解决方案

void LevelOrder(void (*Visit)(T& x));

protected:

BTNode* root;

private:

void Clear(BTNode* &t);

int Depth(BTNode * root);

void leaves(BTNode* root);

int leaves1(BTNode * root);

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

};

【二叉树的部分运算】

Maketree运算

void BinaryTree::MakeTree(const T& x,BinaryTree& left,BinaryTree& right)

{

if(root||&left==&right) return;

root=new BTNode(x,left.root,right.root);

left.root=right.root=NULL;

}

Breaktree运算

void BinaryTree::BreakTree(T& x,BinaryTree& left,BinaryTree& right) {

if(!root||&left==&right||left.root||right.root) return;

x=root->element;

left.root=root->lChild;right.root=root->rChild;

delete root; root=NULL;

}

Root运算

bool BinaryTree::Root(T& x)const

{

if(root){

x=root->element; return true;

}

else return false;

}

相关文档
最新文档