二叉树的各种遍历及直观打印.docx

上传人:b****3 文档编号:11616597 上传时间:2023-06-01 格式:DOCX 页数:15 大小:105.61KB
下载 相关 举报
二叉树的各种遍历及直观打印.docx_第1页
第1页 / 共15页
二叉树的各种遍历及直观打印.docx_第2页
第2页 / 共15页
二叉树的各种遍历及直观打印.docx_第3页
第3页 / 共15页
二叉树的各种遍历及直观打印.docx_第4页
第4页 / 共15页
二叉树的各种遍历及直观打印.docx_第5页
第5页 / 共15页
二叉树的各种遍历及直观打印.docx_第6页
第6页 / 共15页
二叉树的各种遍历及直观打印.docx_第7页
第7页 / 共15页
二叉树的各种遍历及直观打印.docx_第8页
第8页 / 共15页
二叉树的各种遍历及直观打印.docx_第9页
第9页 / 共15页
二叉树的各种遍历及直观打印.docx_第10页
第10页 / 共15页
二叉树的各种遍历及直观打印.docx_第11页
第11页 / 共15页
二叉树的各种遍历及直观打印.docx_第12页
第12页 / 共15页
二叉树的各种遍历及直观打印.docx_第13页
第13页 / 共15页
二叉树的各种遍历及直观打印.docx_第14页
第14页 / 共15页
二叉树的各种遍历及直观打印.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

二叉树的各种遍历及直观打印.docx

《二叉树的各种遍历及直观打印.docx》由会员分享,可在线阅读,更多相关《二叉树的各种遍历及直观打印.docx(15页珍藏版)》请在冰点文库上搜索。

二叉树的各种遍历及直观打印.docx

二叉树的各种遍历及直观打印

 

一.引言2

1.摘要2

2.关键字2

二.正文

1.需求分析2

2.数据结构2

3.算法设计3

3.1概要设计3

3.2详细设计4

4.调试分析6

5.测试结果6

6.源程序9

7.不足之处15

8.

设计体会16

一.引言

二叉树是树形结构的一个重要类型,许多实际问题抽象出来的

数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,因此,二叉树显得特别重要。

(一).摘要

本算法能创建二叉树,满足对二叉树的层序遍历,并打印层序遍历序列;亦能求出二叉树的深度、叶子数、节点数,并能在WINDOWS控制台上打印二叉树。

(二).关键字

二叉树、遍历、打印、递归、队列

二.正文

(一).需求分析

1.问题描述

设计一个二叉树的遍历以及求二叉树深度、节点数、叶子数的程序,该程序有打印二叉树的功能。

2.功能建立二叉树,能够输出二叉树的层序遍历序列,并能求出二叉树的深度、节点数、叶子数和打印二叉树。

3.要求分别建立二叉树存储结构的输入函数、输出层序遍历序列的函数、输出二叉树深度、节点数、叶子数的函数、打印二叉树的函数。

(三).数据结构

存储结构采用了链式存储,属于链式存储结构:

typedefstructnode{datatypedata;

structnode*lchild,*rchild;

}BinTNode;

(四).算法设计

1.概要设计

本程序要实现对二叉树的层次遍历以及求解二叉树的深度、节点数、叶子树的算法,并且在程序中要建立二叉树,打印二叉树形状。

本程序中用到的函数:

Creatree()

操作结果:

建立一个新的二叉树

VoidTreeDepth()

操作结果:

求二叉树的深度、结点数及叶子数

VoidLevelorder()

操作结果:

层序遍历二叉树,得出二叉树的层序遍历序列

Voidprint()

操作结果:

在windows控制台上打印二叉树

主函数流程以及各模块间的关系:

 

主函数

(main)

 

 

2.详细设计

深度、节点、叶子

(TreeDepth)

每个操作的伪码算法

(1)BnTNodecreatree()

lf(ch!

二‘@)

分配内存

s->data=ch;

if(rear=1)

root二s;

else{左孩子=s;或者右孩子=s

}

(2)intTreeDepth()

h1为左深度,h2为右深度;

二叉树深度为h1、h2的最大值加1;

节点数二节点数+1(节点数初始值为0);

If(h1==0&&h2=0

叶子数加1;

3)voidLevelorder()

根入队;

while(front!

=rear)

front出队,输出节点;

if(左孩子不空)

左孩子入队;

If(右孩子不空)

右孩子入队;

4)voidprint_btree()

If(T!

=NULL)

递归打印右子树、level+1;

for(i=0;i

输出节点;

递归打印右子树、level+1;

4)voidprint()

调用print_btree();

(5)main()

调用creatree()建立二叉树;do

{输入0-5个菜单选择;

switch(i)

case

(1):

创建二叉树;

case

(2):

调用TreeDepth()求树的深度、叶子树、及节点数;

case(3):

调用Levelorder()输出层序遍历二叉树的序列;case(4):

调用print()打印二叉树;

case(0):

break;

}while(i!

=0);

(5).调试分析

a.在第二次创建二叉树之后求叶子与节点时,输出结果是第一次的输出结果,在主函数中在调用TreeDepth()函数前,将叶子数和节点树置为0,就解决此问题。

b.同一棵二叉树调用TreeDepth()函数,输出的叶子数和节点数会成倍的增长,同样的在调用此函数前将节点数和叶子数置0.

(6).调试结果

根据提示输入二叉树序列,运行情况如下:

输入12345@@@@67#

a.求二叉树的深度、叶子数、节点数,运行结果如下:

节点数及叶子数

斗MK員■;select1:

刨建二叉械釦输出二叉树命踵3:

层次遍历二叉旃:

;舉二叉树

岂叉树深度Y节点数T叶子数T

■—__—_1—.a—as—ns—ci—as—s'a—cs_Ji

创虑二

输出二*

^^次逋=■

細二叉树

IKE.iMHWtJMKtCK.

节点.数及叶子数

ML-MXM

b.层次遍历二叉树,运行结果如下:

二叉树棵度=4节点数=7叶子数=4

1:

创建二叉耐

型输出二叉树幽裸底,节点数及叶子数

3=启次遍话二叉亦

•―二叉树

4:

0:

层次遍历序列:

1234567

・*■#■笛.■■出誓梓互14戶■话.管■笛誓■甘

1

2

3

4

Q

蹩讓騎"叶子数

盟二抄

rl

C.打印

运行情况如下

 

■■■if型UKiBiriHselee>rfci*it

1=僧瞳二叉妁

补输出二夏树餡深虞’节点数及叶子数

3=层次遍历二叉矿

4,打甲二叉树

0:

邁由

•><些甌耳1<1|~些竺耳斗列耳if-if■其■«-*!

<

屮pw*mh**h*wgelect

节点数及叶子数

1=创建二民树

3=层次遍历二叉櫛

4=打印二叉树

«:

邁由

A.创建新的二叉树•并输出深度,节点数,叶子数;运行结果如下:

 

B.层次遍历新二叉树,并打印二叉树,运行结果如下:

打印二叉树

JKKJaJtKJCXJitMM:

SeleCtJOCKJOfXJCXJCMKJC1:

创建二叉树

辰次遍历序列:

ABCDEFGHI

JtJCJCJtB[:

>tMKS号leCt誉-MHMTHCM:

M:

ItJtMM:

JC

I:

仓腱二X林

鉄输出二叉哋琨聡节点数及叶子数3=层我殖历二夏轿4:

打用二支树

0=退由

(七).不足之处

在windows控制台上打印二叉树时,是按中序遍历打印的,打印的树形结构(右子数在上,左子数在下,根在最左边)要通过旋转90度才能看到我们平日看到的树形二叉树(根在上,左右子数在下)。

(八).设计体会

经过了两个周的学习,通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。

把死板的课本知识变得生动有趣,激发了学习的积极性。

把学过的c语言知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。

加深了对c语言和数据结构的巩固,在学习中不仅仅是局限于课本知识,更要懂得查阅资料,不论基础有多扎实,都要查阅相关书

籍,查阅资料,找到更好的解决方法。

四.参考文献

《数据结构课程设计案例精编》李建学等主编清华大学出版社2007《c程序设计》谭浩强主编清华大学出版社2005

《数据结构c语言版》严蔚敏主编清华大学出版社2009

五.附录(源程序)

#include"stdio.h"#include"malloc.h"#include"stdlib.h"

#include"stddef.h"

#defineMax20/*结点的最大个数*/

typedefintdatatype;

typedefstructnode{datatypedata;

intnum;

structnode*lchild,*rchild;

}BinTNode;/*自定义二叉树的结点类型*/

BinTNode*q[Max];

typedefBinTNode*BinTree;/*定义二叉树的指针*/intNodeNum,leaf;/*NodeNum为结点数,leaf为叶子数*/inta=0;

BinTNode*creatree()

{charch;

intfront,rear;

BinTNode*s,*root;

root=NULL;

front=1;

rear=0;

printf("虚节点用@表示,以#结束\n");

printf("请输入一棵二叉树序列!

\n");ch=getchar();

while(ch!

='#')

{s=NULL;

if(ch!

='@')

{s=malloc(sizeof(BinTNode));

s->data=ch;s->lchild=s->rchild=NULL;

}

rear++;

q[rear]=s;

if(rear==1)

root=s;

else

{if(s&&q[front])

if(rear%2==0)

q[front]->lchild=s;

else

q[front]->rchild=s;

if(rear%2==1)

front++;

}

ch=getchar();

}

returnroot;

}

/*=====采用后序遍历求二叉树的深度、叶子结点数及数的递归算法========*/

intTreeDepth(BinTreeT)

{

inthl,hr,max;

if(T){

hl=TreeDepth(T->lchild);/*求左深度*/

hr=TreeDepth(T->rchild);/*求右深度*/

max=hl>hr?

hl:

hr;/*取左右深度的最大值*/NodeNum=NodeNum+1;/*求结点数*/

*/

return(max+1);

}elsereturn(0);

}

/*====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========*/voidLevelorder(BinTreeT)

{intfront=0,rear=1;

BinTNode*cq[Max],*p;/*定义结点的指针数组cq*/cq[1]=T;/*根入队*/

while(front!

=rear)

{front=(front+1)%NodeNum;

p=cq[front];/*出队*/printf("%c",p->data);/*出队,输出结点的值*/

if(p->lchild!

=NULL){

rear=(rear+1)%NodeNum;

cq[rear]=p->lchild;/*左子树入队(指针替换)*/

}

if(p->rchild!

=NULL){rear=(rear+1)%NodeNum;

cq[rear]=p->rchild;/*右子树入队*/

}}}

voidprint_btree(BinTreeT,intlevel)

{inti=0;

if(T==NULL)return;print_btree(T->rchild,level+1);

//缩进level*2个字符for(i=0;i

//假设你的二叉树的结点存放的是一个字符printf("%c\n",T->data);

print_btree(T->lchild,level+1);

}//打印二叉树

voidprint(BinTreeT)

{

print_btree(T,0);

}

/*==========主函数=================*/

main()

{

BinTreeroot;

inti,j=0,depth,nLayer;

root=NULL;

printf("\n");

root=creatree();/*创建二叉树,返回根结点*/

do{/*从菜单中选择遍历方式,输入序号。

*/

printf("\t1:

创建二叉树\n");

printf("\t2:

输出二叉树的深度,节点数及叶子数\n");

printf("\t3:

层次遍历二叉树\n");/*按层次遍历之前,先选择

printf("\t**********select

************

\n");

4,求出该树的结点数*/

printf("\t4:

打印二叉树\n");

printf("\t0:

退出\n");

scanf("%d",&i);/*输入菜单序号(0-5)*/

getchar();

switch(i){

case1:

printf("创建二叉树:

");

printf("\n");root=creatree();

break;

case2:

NodeNum=0;leaf=0;depth=TreeDepth(root);/*求树的深

度及叶子数*/

printf("二叉树深度=%d节点数=%d",depth,NodeNum);

printf("叶子数=%d",leaf);

break;

case3:

printf("层次遍历序列:

");

Levelorder(root);/*

按层次遍历*/

 

break;

case4:

printf("打印二叉树:

\n");print(root);

break;

case0:

break;

default:

puts("again");

}

printf("\n");

}

while(i!

=0);

}

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

当前位置:首页 > 成人教育 > 成考

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2