哈尔滨理工大学运算机学院数据结构课程设计成立二叉树层序先序.docx
《哈尔滨理工大学运算机学院数据结构课程设计成立二叉树层序先序.docx》由会员分享,可在线阅读,更多相关《哈尔滨理工大学运算机学院数据结构课程设计成立二叉树层序先序.docx(9页珍藏版)》请在冰豆网上搜索。
哈尔滨理工大学运算机学院数据结构课程设计成立二叉树层序先序
哈尔滨理工大学运算机学院
数据结构课程设计
成立二叉树
层序、先序遍历
班级:
计05-1班
姓名:
杨继伟
学号:
题目分析2
成立二叉树,层序、先序遍历
1需求分析:
.题目:
建立二叉树,要求能够输入树的各个节点,并能够输出用不同方式遍历的遍历序列;别离成立二叉树存储的输入函数,输出层序遍历序列的函数,输出先序遍历序列的函数。
分析:
第一要输入元素成立二叉树,选择某一种存储结构存储二叉树,本程序采纳二叉链表存储结构。
由于二叉树的概念是递归的,因此一棵非空二叉树能够看做是由根结点、左子树和右子树这三个大体部份组成的。
若是能依次遍历这三个部份的信息,也就遍历了整个二叉树。
由此取得的二叉树的遍历是按某种策略访问二叉树中的每一个结点且仅访问一次的进程。
程序一共分为如下3个模块:
二叉树的构造:
Insert_node(btree*root,intnode)
{……
}
create_btree(intdata[],intlen)
{……
}
层序遍历二叉树:
Voidlevelorder(bitree*root)
{……
}
先序遍历二叉树:
Voidpreorder(bitree*root)
{……
}
.二叉树的构造
采纳二叉链表存储结组成立二叉树,二叉树的结点由一个数据元素和别离指向其左右子树的两个分支组成,即数据域和左、右指针域
lchild
data
rchild
数据结构:
Typedefstrcutbnode
{
Telemtypedata;序遍历二叉树
要采纳一个队列。
先将二叉树的根节点入队,然后退队,输出该节点,假设它有左子树,便将左子树的根节点入队,假设它有左子树,便将有子树的根节点入队,直到队列空为止。
采纳递归方式遍历。
.先序遍历二叉树
假设树不空,先访问根节点,第二访问左子树,最后访问右子树。
采纳非递归方式遍历。
2.概要设计
1)二叉树的构造算法
先依序输入元素值,并存入数组nodelist中,再用函数一一插入二叉树的节点成立二叉树,节点的成立是将左子针指向左子树,右子针指向右子树
。
算法流程图如下:
Insert_node(btree*root,intnode):
Node=>newpointer->data,
Newpointer->lchild=null
Newpointer->rchild=null
Currentpointer=root
Parentpointer=currentpointer
Root=null
Currentpointer=null
Returnnewpointer
Y
N
N
Y
1
2
初始化,令插入结点为根指针,左右孩子为空
存储目前结点指针
存储父结点指针
Parentpointer->data>node
Currentpointer->data>node
Currentpointer=currentpointer->lchild
Returnroot
Currentpointer=currentpointer->rchild
Parentpointer->lchild=newpointer
Parentpointer->rchild=newpointer
N
Y
Y
N
2
1
父结点大于插入结点
目前结点大于插入结点
create_btree(intdata[],intlen):
I=0,btree*root=null
Root=insert_node()
I++
IReturnroot
Y
N
调用insert_node()函数
2)层序遍历二叉树:
算法流程图如下:
Front=0,rear=0
Vec[rear]=root,rear++
Root=[front],front++
Root=null
Front输出root->data
Y
N
结束
1
2
建立一个队列,队列为空
根指针进队
队首元素出队
Root->rchild=
null
输出root->lchild->data
Rear++,vec[rear]=
root->lchild
Root->rcild=null
输出root->rchild=null
Vec[rear]=root->
rchild,rear++
结束
1
2
N
N
Y
3)先序遍历二叉树:
算法流程图如下:
Btree*p,*s[100]
Top=0
P=s[top--]
P=p->rchild
s[++top]=p
p=p->lchild
(p!
=null)||(top>0)
输出p->data
结束
P=null
N
Y
Y
N
top为栈顶指针
5)主函数
流程图:
开始
结束
Btree*root=null,
nodelist[20],
index=0
输入value
Nodelist[index]=value
Index++
Root=create_btree(nodelist,index)
输入value
Preorder()
Levelorder()
Value=0
NNN
Y
层序遍历
前序遍历
建立一维数组存取结点值
输入各个结点
以0为结束符
建立二叉树
3.详细设计
#include<>
#include<>
Typedefstructbtnode
{
Intdata;
Structbtnode*lchild,*rchild;
}bitree;
Bitree*insert_node(bitree*root,charnode)
设总结
二叉树是一种超级重要的数据结构,几乎任何数据结构都能够用二叉树来表示,二叉树的衍生结构能够应用于很多结构描述上,因此熟练的把握二叉树的操作方式,对实际程序编写有专门大增进,对锻炼自己的算法意识也有益处。
我总结了以下几点:
1)二叉树的概念是递归的,因此二叉树或为空,或是由一个根结点加上两棵别离称为左子树和右子树的互不相交的二叉树组成。
2)采纳二叉链表存储,链表的头指针指向二叉树的根结点,在含有n个节点的二叉链表中有n+1个空链域
3)二叉树的遍历有先序,中序后序层序等从递归执行的角度来看,先序,中序后序是完全相同的,对含n个结点的二叉树,其时刻算法复杂度为O(n),所需辅助空间为遍历进程中占的最大容量,即树的深度,,那么空间复杂度也为O(n)
4)递归算法与非递归算法的不同:
从递归角度来看,递归操作隐式地挪用系统栈,使时刻和空间性能有比较大的损耗。
5)二叉树遍历的概念是很重要的,经常使用于解决实际问题。
一个最简单的例子确实是能够将表达式(a-b)/(c+d)表示成一棵二叉树,遍历二叉树可计算出表达式的值。
感想:
通过一个礼拜的课程设计,使我意识到了自己多方面的不足,但同时也激发了我学习的踊跃性。
一样我也意识到了学好数据结构的重要性。
编程,调试进程真的需要专门大的耐性,编好程序绝对不是一朝一夕就能够学会的,这需要长时刻的体会积存,磨炼,反复编程。
在调试进程中不断发觉新问题不断更正。
当运行正确时,那份自豪与兴奋是无可替代的,让我我记住这份心情,把编程之路继续下去。