树和二叉树实验报告.docx
- 文档编号:2910854
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:18
- 大小:233.42KB
树和二叉树实验报告.docx
《树和二叉树实验报告.docx》由会员分享,可在线阅读,更多相关《树和二叉树实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
树和二叉树实验报告
树和二叉树实验报告
树和二叉树实验报告
课程数据结构实验名称树和二叉树
系别____计算机学院专业班级__软件134_____
姓名__徐雅欣____学号_201300406134实验日期:
2014年6月7日
一.实验目的:
(一)掌握二叉树,二叉树排序数的概念及存储方法。
(二)掌握二叉树的遍历算法
(三)熟练掌握编写实现树的各种运算的算法
二.实验内容
(-)实验题目一:
建立一棵二叉树并中序遍历(填空)
1.要点分析:
中序遍历的遍历规则是(前中后),既先访问左子树,在访问当前节点,最后访问右子树。
2.程序源代码:
#include
#include
structnode
{
chardata;
structnode*lchild,*rchild;
}bnode;
typedefstructnode*blink;
blinkadd(blinkbt,charch){
if(bt==NULL)
{
bt=(blink)malloc(sizeof(bnode));
bt->data=ch;
bt->lchild=bt->rchild=NULL;
}
elseif(ch
bt->lchild=add(bt->lchild,ch);
else
bt->rchild=add(bt->rchild,ch);
returnbt;
}
voidinorder(blinkbt){
if(bt)
{
inorder(bt->lchild);
printf("%2c",bt->data);
inorder(bt->rchild);
}
}
main()
{
blinkroot=NULL;
inti,n;
charx;
scanf("%d",&n);
for(i=0;i<=n;i++)
{
x=getchar();
root=add(root,x);
}
inorder(root);
printf("\n");
}
3.实验结果:
(二)实验题目2:
编写程序,求二叉树的节点数和叶子树。
1.要点分析:
.定理:
二叉树如果有v0个叶子节点,那么就有v0-1个度为二的节点就是v0-1=v2
定理:
二叉树有N个节点N=v0+v1+v2即节点总数等于度为0,1,2的节点的和。
2.程序源代码:
#include
#include
#defineERROR0
#defineOK1
#defineOVERFLOW-2
#defineTRUE1
typedefintStatus;
typedefcharTElemType;
typedefstructBiTNode
{TElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
intcount=0;
StatusCreateBiTree(BiTree*T)
{
charch;
scanf("%c",&ch);
if(ch=='')(*T)=NULL;
else{
if(!
((*T)=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
returnOK;
}
StatusCountleaf(BiTreeT)
{
if(T)
{if((!
T->lchild)&&(!
T->rchild))count++;
Countleaf(T->lchild);
Countleaf(T->rchild);
}
returncount;
}
StatusDepth(BiTreeT)
{intdepthval,depthleft=0,depthright=0;
if(!
T)depthval=0;
else
{depthleft=Depth(T->lchild);
depthright=Depth(T->rchild);
depthval=1+(depthleft>depthright?
depthleft:
depthright);
}
returndepthval;
}
StatusPreorder(BiTreeT)
{if(T)
{printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
StatusInOrderTraverse(BiTreeT,Status (*Visit)(TElemTypee)){
StackS;InitStack(S);p=T;
while(p=!
StackEmpty(S)){
if (p){Push(S,p);p=p->lchild;}
else{Pop(S,p);if(!
Visit(p->data))returnERROR;
p=p->rchild;
}
}
returnOK;
}
voidmain()
{BiTreeT;
printf("pleaseinputaTree:
");
CreateBiTree(&T);
printf("theTreeis:
");
Preorder(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
printf("thenumberofleavesis:
");
printf("%d",Countleaf(T));
printf("\n");
printf("theDepthofthetreeis:
");
printf("%d",Depth(T));
getch();
}
3.实验结果:
(三)实验题目3:
编写程序,实现按层次遍历二叉树。
1.要点分析:
定义:
1、满二叉树:
一棵深度为k且有2的k次方减1个结点的二叉树称为满二叉树
2、完全二叉树:
如果有深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。
性质:
1、二叉树的第i层上至多有2的i-1次方个结点(i>=1)。
2、深度为k的二叉树至多有2的k次方减1个结点(k>=1)。
3、对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
4、具有n个结点的完全二叉树的深度为以2为底n的对数取下限加1。
5、如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1=
(1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则双亲PARENT(i)是结点[i/2]
(2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i
(3)如果2i+1>n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i+1.
存储结构:
顺序存储结构(数组方式),链式存储结构(二叉链表)
2.程序源代码:
#include
#include
#include
#defineMAXSIZE50
typedefcharDataType;
structnode
{
DataTypedata;
structnode*lchild;
structnode*rchild;
}BitNode;
typedefstructnode*BiTree;
voidCreateBiTree(BiTree*T)
{
DataTypech;
ch=getchar();
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BitNode));
if(!
(*T))
exit(-1);
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
voidLayerOrder(BiTreeT)
{
BiTreequeue[MAXSIZE];
//BitNode*p;
BiTreep;
intfront,rear;
front=rear=-1;
rear++;
queue[rear]=T;
while(front!
=rear)
{
front=(front+1)%MAXSIZE;
p=queue[front];
printf("%2c",p->data);
if(p->lchild!
=NULL)
{
rear=(rear+1)%MAXSIZE;
queue[rear]=p->lchild;
}
if(p->rchild!
=NULL)
{
rear=(rear+1)%MAXSIZE;
queue[rear]=p->rchild;
}
}
printf("\n");
}
voidmain()
{
BiTreeT=NULL;
printf("创建一颗二叉树<#>表示空:
\n");
CreateBiTree(&T);
printf("\n");
printf("二叉数层次遍历为:
\n");
LayerOrder(T);
}
3.实验结果:
(四)实验题目4:
编写程序,对二叉树进行先序遍历,并打印层号。
1.要点分析:
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。
因此,在任一给定结点上,可以按某种次序执行三个操作:
(1)访问结点本身(N),
(2)遍历该结点的左子树(L),
(3)遍历该结点的右子树(R)。
根据遍历的原则:
先左后右,对于先序遍历,顾名思义就是先访问根节点,再访问左子树,最后访问右子树,
2.程序源代码:
#include
#include
#include
#defineMAXSIZE50
typedefcharDataType;
structnode
{
DataTypedata;
structnode*lchild;//指向左孩子结点
structnode*rchild;//指向右孩子结点
intlevel;
}BitNode;
typedefstructnode*BiTree;
voidCreateBiTree(BiTree*T)
{
DataTypech;
ch=getchar();
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BitNode));//生成根节点
if(!
(*T))
exit(-1);
(*T)->da
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 实验 报告