《数据结构》课程设计报告设计题目 二叉树的遍历
姓名
___________学 号 211001047________专 业 计算机科学与技术院 系 计算机科学与技术班 级 1002_____________指导教师 吴克力___________
2012年3月1日摘要:本文主要说明如何实现二叉树的遍历。此次二叉树的遍历基于二叉树的二叉链表存储结构。遍历方式包括:前序遍历 中序遍历 后续遍历层序遍历。其中前序遍历和后续遍历采用非递归算法实现。 编程环境为VC++,除了遍历操作外还增加了求二叉树的深度总结点数每层结点数 以及最近共同祖先LCA问题的算法。关键字:二叉树遍历非递归C++LCA
Abstract:This paper mainly describes how to implement bin ary tree traversal Thebin ary tree traversal is based on bin ary tree binary storage structure.Traversalmethod in eludes:preorder traversaljnorder traversal,postorder traversal, levelordertraversal.The former preorder traversal and postorder use of non・ recursivealgorithm.Programming environment is VC++z in addition to traversal operation,also in creased for solving the bin ary tree depth、 summary points and each layer ofno des,as well as the most rece nt comm on ancestor(LCA)algorithm.
Keywords:binary tree traversal non-recursive C++LCA
目录
一. 问题描述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
问题描述创建二叉树并遍历. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
基本要求. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
二. 需求分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
三.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .概
要设计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
1 ・创建二叉树. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .二叉
树的非递归的序遍历示意图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
3・二叉树的后序非递归遍历示意图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
四.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .数
1. 二叉树结点数据类型定义为:
据结构设计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. 二叉树数据类型定义为. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
五.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .算
法设计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2、非递归前序遍历. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
3、非递归后序遍历. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
4、求二叉树的高度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
5、 求二叉树每一层的结点数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
6、求两节点最近共同祖先. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
6、算法流程图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
六、程序测试与实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 1
1、 函数之间的调用关系. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
2、主程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
3、测试数据. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
4、测试结果. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
七、调试分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
八、遇到的问题及解决办法 • ••••••
九.心得体会 • ••••••
十.参考文献. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
一、 问题描述
问题描述创建二叉树并遍历
基本要求
1、 分别运用非递归的方式完成对二叉树的先序和后序遍历
2、 输出二叉树的高度
3、 输出每一层的结点数
4、 查找结点P和结点Q的最近共同祖先
二、需求分析
1. 本程序的功能包括二叉树的建立二叉树的递归颯历二叉树的非递归遍历查询二叉树的
深度查询每层的结点数查找两个结点的最近共同祖先二叉树的打印。
2. 程序运行后显现提示信息等候用户输入0—6以进入相应的操作功能。
3. 用户输入数据完毕程序将输出运行结果。
4. 测试数据应为字符型数据。
三、概要设计
1.创建二叉树
输入数据不低于15个用递归方法建立二叉树。
2.二叉树的非递归前序遍历示意图
图3.2二义树前序遍历示意图
3.二叉树的后序非递归遍历示意图
图3.4二义树后序遍历示意图
四. 数据结构设计
1. 二叉树结点数据类型定义为template<typename T>struct BiNode
{
BiNode<T>*rchild, *lch订d;//指向左右孩子的指针
T data; //结点数据信息
}
2. 二叉树数据类型定义为template<typename T>class BiTree
{template<typename T>friend ostream&operator«(ostream&os ,BiTree<T>&bt);public
B订ree();//无参构造函数
BiTree(int m) {} ;//有参空构造函数
BiTree(T ary[], int num,T none) ; //有参构造函数
"BiTree 0; 〃析构函数void preorder 0;7递归前序遍历void inorder() ;7递归中序遍历void postorder 0;//递归后续遍历void levelorder 0;//层序遍历int count()://讣算二叉树的结点数int depth();//ir算二叉树的深度void display(ostream&os);//打印二叉树,有层次void LevelNumO;//计算每一层结点数void PreOrder 0;//非递归前序遍历void PostOrder 0;//非递归后用遍历void creat ();//创建二叉树T leastCommanAncestor (T va,T vb); //求树中任意两结点最近共同祖先p r o te c te d
//以下函数供上而函数调用
//对应相同功能void creat(BiNode<T>*&root);//创建void release(BiNode<T>*&root) ;//删除
BiNode<T> *Bui Id (T ary[], int num, T none, int idx)数组创建二叉树void PreOrder(BiNode<T>* root) ;//前序遍历 void PostOrder (BiNode<T>* root) ;//后续遍历 voidLevelNum(BiNode<T>* root); //层序遍历void preorder (BiNode<T>* root) ; //递归前序遍历void inorder (BiNode<T>*root);//递中序遍历void postorder (BiNode<T>*root) ;//递归后续遍〃j void levelorder (BiNode<T>*root) ;//层序遍历int count (BiNode<T>* root) ;//il*算结点数intdepth(BiNode<T>*root);//讣算深度void display(os tream&os,BiNode<T>*root, int dep); //扌丁卬static boolleastCommanAncestor(BiNode<T>*root,T va,T vb,BiNode<T>*&result,BiNode<T>*parrent) /7求最近共同祖先pri v ate
BiNode<T>*rootptr;
};
五、算法设计
1、创建二叉树
//实现外部递归调用void BiTree<T>: :creat() {c re at(ro otptr);
}
//类体内递归创建二叉树template<typename T>
void BiTree<T> :creat(BiNode<T>*&root){
T item;cin»item;if(item=='于)root=NULL;elseroot->data=item;cre at(ro ot->lchild);creat(root">rchil d);
}
}
2、非递归前序遍历template<typename T>void BiTree<T>: :PreOrder 0
{
P re Orde r(roo tptr);
}template<typename T>void BiTree<T> :PreOrder(BiNode<T>*root){stack<Bi No de<T>*>s;whi 1 e(root!=NULL: !s.empty())
{whi l e(ro o t)
{cout«root->data;s・pus h(ro ot);ro ot=:ro ot->lchild;
}i f(!s.e m pty0)
{root=s・ top();s・pop();root=root">rchild;
}
}
}
3、非递归后序遍历template<typename T>void BiTree<T>: :PostOrder()
{
P o stOrder(rootptr);
}template<typename T>
void BiTree<T> :PostOrder(BiNode<T>*root)
{stack<BiNo de<T>*>s;//定义栈.节点类型为Tre eXo deBiNode<T>*p=root;
BiNo de<T>*pre=NUL L;//pre.让近一次访问的
介绍:819云怎么样?819云创办于2019,由一家从2017年开始从业的idc行业商家创办,主要从事云服务器,和物理机器819云—-带来了9月最新的秋季便宜vps促销活动,一共4款便宜vps,从2~32G内存,支持Windows系统,…高速建站的美国vps位于洛杉矶cera机房,服务器接入1Gbps带宽,采用魔方管理系统,适合新手玩耍!官方网站:https://www.8...
DiyVM是一家低调国人VPS主机商,成立于2009年,提供的产品包括VPS主机和独立服务器租用等,数据中心包括香港沙田、美国洛杉矶、日本大阪等,VPS主机基于XEN架构,均为国内直连线路,主机支持异地备份与自定义镜像,可提供内网IP。最近,商家对香港机房VPS提供5折优惠码,最低2GB内存起优惠后仅需50元/月。下面就以香港机房为例,分享几款VPS主机配置信息。CPU:2cores内存:2GB硬...
【双十二】兆赫云:全场vps季付六折优惠,低至50元/季,1H/1G/30M/20G数据盘/500G流量/洛杉矶联通9929商家简介:兆赫云是一家国人商家,成立2020年,主要业务是美西洛杉矶联通9929线路VPS,提供虚拟主机、VPS和独立服务器。VPS采用KVM虚拟架构,线路优质,延迟低,稳定性强。是不是觉得黑五折扣力度不够大?还在犹豫徘徊中?这次为了提前庆祝双十二,特价推出全场季付六折优惠。...