树和二叉树实验报告Word文件下载.docx
《树和二叉树实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《树和二叉树实验报告Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
if(bt==NULL)
{
bt=(blink)malloc(sizeof(bnode));
bt->
data=ch;
lchild=bt->
rchild=NULL;
}
elseif(ch<
bt->
data)
lchild=add(bt->
lchild,ch);
else
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:
编写程序,求二叉树的节点数和叶子树。
.定理:
二叉树如果有v0个叶子节点,那么就有v0-1个度为二的节点就是v0-1=v2
定理:
二叉树有N个节点N=v0+v1+v2即节点总数等于度为0,1,2的节点的和。
#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)->
CreateBiTree(&
((*T)->
lchild));
rchild));
returnOK;
StatusCountleaf(BiTreeT)
if(T)
{if((!
T->
lchild)&
&
(!
rchild))count++;
Countleaf(T->
rchild);
returncount;
StatusDepth(BiTreeT)
{intdepthval,depthleft=0,depthright=0;
T)depthval=0;
else
{depthleft=Depth(T->
depthright=Depth(T->
depthval=1+(depthleft>
depthright?
depthleft:
depthright);
returndepthval;
StatusPreorder(BiTreeT)
{if(T)
{printf("
%c"
T->
Preorder(T->
lchild);
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);
Visit(p->
data))returnERROR;
rchild;
voidmain()
{BiTreeT;
printf("
pleaseinputaTree:
"
T);
theTreeis:
Preorder(T);
InOrderTraverse(T);
thenumberofleavesis:
Countleaf(T));
theDepthofthetreeis:
Depth(T));
getch();
(三)实验题目3:
编写程序,实现按层次遍历二叉树。
定义:
1、满二叉树:
一棵深度为k且有2的k次方减1个结点的二叉树称为满二叉树
2、完全二叉树:
如果有深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。
性质:
1、二叉树的第i层上至多有2的i-1次方个结点(i>
=1)。
2、深度为k的二叉树至多有2的k次方减1个结点(k>
3、对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
4、具有n个结点的完全二叉树的深度为以2为底n的对数取下限加1。
5、如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1=<
i=<
n)有:
(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.
存储结构:
顺序存储结构(数组方式),链式存储结构(二叉链表)
stdlib.h>
#defineMAXSIZE50
typedefcharDataType;
DataTypedata;
structnode*lchild;
structnode*rchild;
}BitNode;
typedefstructnode*BiTree;
voidCreateBiTree(BiTree*T)
DataTypech;
ch=getchar();
if(ch=='
#'
)
*T=NULL;
*T=(BiTree)malloc(sizeof(BitNode));
if(!
(*T))
exit(-1);
(*T)->
CreateBiTree(&
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];
p->
if(p->
lchild!
=NULL)
{
rear=(rear+1)%MAXSIZE;
queue[rear]=p->
}
rchild!
BiTreeT=NULL;
创建一颗二叉树<
#>
表示空:
\n"
二叉数层次遍历为:
LayerOrder(T);
(四)实验题目4:
编写程序,对二叉树进行先序遍历,并打印层号。
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。
因此,在任一给定结点上,可以按某种次序执行三个操作:
(1)访问结点本身(N),
(2)遍历该结点的左子树(L),
(3)遍历该结点的右子树(R)。
根据遍历的原则:
先左后右,对于先序遍历,顾名思义就是先访问根节点,再访问左子树,最后访问右子树,
//指向左孩子结点
//指向右孩子结点
intlevel;
//生成根节点
da