数据结构二叉树的算法.docx

上传人:b****5 文档编号:5747494 上传时间:2022-12-31 格式:DOCX 页数:11 大小:94.91KB
下载 相关 举报
数据结构二叉树的算法.docx_第1页
第1页 / 共11页
数据结构二叉树的算法.docx_第2页
第2页 / 共11页
数据结构二叉树的算法.docx_第3页
第3页 / 共11页
数据结构二叉树的算法.docx_第4页
第4页 / 共11页
数据结构二叉树的算法.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数据结构二叉树的算法.docx

《数据结构二叉树的算法.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树的算法.docx(11页珍藏版)》请在冰豆网上搜索。

数据结构二叉树的算法.docx

数据结构二叉树的算法

 

数据结构课程设计报告

二叉树算法

计算机科学与技术学院

计算机网络1102班

学号:

1108040212

张花

 

二叉树算法

一.课程设计目的与要求:

1.掌握二叉树的基本概念和性质

2.掌握创建和构造二叉树的算法

3.掌握二叉树存储基本的三种递归算法

4.掌握计算二叉树的结点

实验要求:

(1)理解二叉树的初始化二叉树空的判断;

(2)理解二叉树的遍历算法,掌握其基本应用。

二.实验原理及内容

实验题目:

1.创建二叉树的链表结构;

2.实现二叉树链表的初始化算法,二叉树空的判断算法;

3.实现二叉树的先序遍历算法,中序遍历算法和后序遍历算法;

4.利用某遍历算法实现计算二叉树中的叶子结点;

5.求二叉树中的结点数;

6.设计一个算法,求二叉树指定的结点x的层数,求先序遍历序列中第k个结点的左孩子;

三.课程设计内容解答:

1.二叉树的二叉链式存储结构的结点结构体定义

typedefstructnode

{TElemTypedata;

structnode*left;

structnode*right;

structnode*parent;

}BiTNode,*BiTree;

2.写二叉树的先序,中序,后序遍历算法

先序遍历算法

voidProrder1(BiTNode*bt,void(*visit)(TElemType))

{if(bt!

=NULL)

{visit(bt->data);

Prorder1(bt->left,visit);

Prorder1(bt->right,visit);

}}

中序遍历算法

voidProrder2(BiTNode*bt,void(*visit)(TElemType))/

{BiTNode*p,*stack[MAS];

inttop;

top=0;p=bt;

while(top!

=0||p!

=NULL)

{while(p!

=NULL)

{stack[top]=p;top++;

p=p->left;

}

if(top!

=0)

{p=stack[top-1];

top--;

visit(p->data);

p=p->right;

}

}

}

后序遍历算法

voidProrder3(BiTNode*bt,void(*visit)(TElemType))/

{BiTNode*p,*stack[MAS];

inttop;

top=0;

stack[top]=bt;top++;

while(top>0)

{p=stack[top-1];top--;

while(p!

=NULL)

{visit(p->data);

stack[top]=p->right;

top++;

p=p->left;

}

}

}

等一系列的代码说明就不再报告中啰说还占用报告篇幅

 

4.程序结果截图

 

五.课程设计小结

1.指出二叉树的顺序存储和链式存储的优缺点:

(顺序存储可能会浪费空间,但是读取某个指定节点的时候效率比较高)

2.将你测试使用的二叉树,如果使用顺序存储,请画出存储结构

3.课程设计的时间好短啊,好难的课程设计啊!

附件:

#include

#include

#defineMAX50

#defineMAS20

#defineCHAR1

#ifCHAR

typedefcharTElemType;

TElemTypeNil='';

#defineform"%c"

#else

typedefintTElemType;

TElemTypeNil=0;

#defineform"%d"

#endif

typedefstructnode

{TElemTypedata;

structnode*left;

structnode*right;

structnode*parent;

}BiTNode,*BiTree;

BiTNode*InitBiTree(BiTNode*bt)

{

bt=NULL;

returnbt;

}

BiTNode*CreateBiTree(BiTNode*bt)

{TElemTypech;

scanf(form,&ch);

if(ch==Nil)bt=NULL;

else

{bt=(BiTNode*)malloc(sizeof(BiTNode));

if(!

bt)exit(0);

bt->data=ch;bt->parent=NULL;

bt->left=CreateBiTree(bt->left);

if(bt->left)bt->left->parent=bt;

bt->right=CreateBiTree(bt->right);

if(bt->right)bt->right->parent=bt;

}

returnbt;

}

voidPrintTree(BiTNode*bt,inti)

{if(bt!

=NULL)

{PrintTree(bt->right,i+5);

#ifCHAR

if(bt->data!

=Nil)

printf("%*c\n",i,bt->data);

#else

if(bt->data!

=Nil)

printf("%*d\n",i,bt->data);

#endif

PrintTree(bt->left,i+5);

i=i-5;

}

}

voidProrder1(BiTNode*bt,void(*visit)(TElemType))/*先序遍历*/

{if(bt!

=NULL)

{visit(bt->data);

Prorder1(bt->left,visit);

Prorder1(bt->right,visit);

}

}

voidProrder2(BiTNode*bt,void(*visit)(TElemType))/*中序遍历*/

{BiTNode*p,*stack[MAS];

inttop;

top=0;p=bt;

while(top!

=0||p!

=NULL)

{while(p!

=NULL)

{stack[top]=p;top++;

p=p->left;

}

if(top!

=0)

{p=stack[top-1];

top--;

visit(p->data);

p=p->right;

}

}

}

voidProrder3(BiTNode*bt,void(*visit)(TElemType))/*后序遍历*/

{BiTNode*p,*stack[MAS];

inttop;

top=0;

stack[top]=bt;top++;

while(top>0)

{p=stack[top-1];top--;

while(p!

=NULL)

{visit(p->data);

stack[top]=p->right;

top++;

p=p->left;

}

}

}

voidvisit(TElemTypee)

{printf(form"",e);

}

intSumLefts(BiTNode*bt,intsum)

{

if(bt!

=NULL)

{

if(bt->left==NULL&&bt->right==NULL)

{

printf("%4c",bt->data);sum++;

}

sum=SumLefts(bt->left,sum);

sum=SumLefts(bt->right,sum);

}

return(sum);

}

intSumTree(BiTNode*bt)

{staticintsum=0;

if(bt!

=NULL)

{printf("%4c",bt->data);

sum++;

sum=SumTree(bt->left);

sum=SumTree(bt->right);

}

return(sum);

}

BiTNode*Findchar(BiTNode*bt,charch)/*二叉树查找结点*/

{BiTNode*p;/*利用函数名返回结果*/

if(bt!

=NULL)

{if(bt->data==ch)p=bt;

p=Findchar(bt->left,ch);

p=Findchar(bt->right,ch);

}

if(p!

=NULL)return(p);

elsereturn(NULL);

}

voidmain()

{intj,i,a,sum=0;

BiTreebt;

bt=InitBiTree(bt);

#ifCHAR

printf("请先序输入二叉树(如:

ab三个空格表示a为根结点,b为左子树的二叉树)\n");

#else

printf("请先序输入二叉树(如:

12000表示1为根结点,2为左子树的二叉树)\n");

#endif

bt=CreateBiTree(bt);

printf("输入建立的二叉树!

!

!

\n");

PrintTree(bt,5);

do{

printf("------------------------------------------------------------");

printf("\n主菜单");

printf("\n1二叉树先序遍历");

printf("\n2二叉树后序遍历");

printf("\n3二叉树中序遍历");

printf("\n4二叉树叶子结点数");

printf("\n5二叉树结点数");

printf("\n6二叉树查找x结点");

printf("\n0退出");

printf("\n----------------------------------------------------------");

printf("\n");

printf("输入你要选择的数据:

");

scanf("%d",&i);

switch(i)

{case1:

printf("先序遍历结果为:

");

Prorder1(bt,visit);

break;

case2:

printf("后序遍历结果为:

");

Prorder2(bt,visit);

break;

case3:

printf("中序遍历结果为:

");

Prorder3(bt,visit);

break;

case4:

j=SumLefts(bt,sum);

printf("树的叶子结点数为%d:

",j);

break;

case5:

j=SumTree(bt);

printf("树的结点数为%d:

",j);

break;

case6:

printf("输入要查找的结点字符x:

");

scanf("%c",&a);scanf("%*c");

//j=Findchar(bt,a);

printf("要查找的结点的指针为%d:

",j);

break;

case0:

exit(0);

}

printf("\n");

//getch();

}while(i>0||i<8);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1