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

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

目录

一.引言-----------------------------------------------------------------------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 四.参考文献-------------------------------------------------------------------16

一. 引言

二叉树是树形结构的一个重要类型,许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二

叉树,因此,二叉树显得特别重要。

(一).摘要

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

(二).关键字

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

二.正文

(一). 需求分析

1. 问题描述

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

2. 功能

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

3.要求

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

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

typedef struct node{

datatype data;

struct node *lchild,*rchild;

}BinTNode;

(四). 算法设计

1. 概要设计

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

本程序中用到的函数:

Creatree()

操作结果:建立一个新的二叉树

V oid TreeDepth()

操作结果:求二叉树的深度、结点数及叶子数

V oid Levelorder()

操作结果:层序遍历二叉树,得出二叉树的层序遍历序列

V oid print()

操作结果:在windows控制台上打印二叉树

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

If(ch!=‘@’)

分配内存

s->data=ch;

if(rear=1)

root=s;

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

}

(2)i nt TreeDepth()

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

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

节点数=节点数+1(节点数初始值为0); If(h1==0&&h2=0)

叶子数加1;

(3)v oid Levelorder()

根入队;

while(front!=rear)

front出队,输出节点;

if(左孩子不空)

左孩子入队;

If(右孩子不空)

右孩子入队;

(4)void print_btree()

If(T!=NULL)

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

for(i=0;i

输出节点;

递归打印右子树、level+1;(4)v oid print()

调用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);

(五). 调试分析

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

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

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

输入12345@@@@67#

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

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

c.打印二叉树,运行情况如下:

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

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

(七).不足之处

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

(八).设计体会

经过了两个周的学习,通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的c语言知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。加深了对c语言和数据结构的巩固,在学习中不仅仅是局限于课本知识,更要懂得查阅资料,不论基础有多扎实,都要查阅相关书

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

四.参考文献

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

《数据结构c语言版》严蔚敏主编清华大学出版社2009 五.附录(源程序)

#include"stdio.h"

#include"malloc.h"

#include"stdlib.h"

#include"stddef.h"

#define Max 20 /*结点的最大个数*/

typedef int datatype;

typedef struct node{

datatype data;

int num;

struct node *lchild,*rchild;

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

BinTNode *q[Max];

typedef BinTNode *BinTree; /*定义二叉树的指针*/

int NodeNum,leaf; /*NodeNum为结点数,leaf为叶子数*/

int a=0;

BinTNode *creatree()

{char ch;

int front,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();

}

return root;

}

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

int TreeDepth(BinTree T)

{

int hl,hr,max;

if(T){

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

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

max=hl>hr? hl:hr; /*取左右深度的最大值*/

NodeNum=NodeNum+1; /*求结点数*/

if(hl==0&&hr==0) leaf=leaf+1; /*若左右深度为0,即为叶子。

*/

return(max+1);

} else return(0);

}

/*====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========*/ void Levelorder(BinTree T)

{ int front=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; /*右子树入队*/

} }}

void print_btree(BinTree T, int level)

{int i=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);

} //打印二叉树

void print(BinTree T)

{

print_btree(T,0);

}

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

main()

{

BinTree root;

int i,j=0,depth,nLayer;

root=NULL;

printf("\n");

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

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

printf("\t********** select ************\n");

printf("\t1: 创建二叉树\n");

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

printf("\t3: 层次遍历二叉树\n"); /*按层次遍历之前,先选择4,求出该树的结点数*/

printf("\t4: 打印二叉树\n");

printf("\t0: 退出\n");

printf("\t*******************************\n");

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

getchar();

switch (i){

case 1:printf("创建二叉树: ");

printf("\n");

root=creatree();

break;

case 2: NodeNum=0;leaf=0;depth=TreeDepth(root); /*求树的深度及叶子数*/

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

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

break;

case 3: printf("层次遍历序列: ");

Levelorder(root); /*按层次遍历 */ break;

case 4:printf("打印二叉树:\n"); print(root);

break;

case 0:break;

default: puts("again");

}

printf("\n");

}

while(i!=0);

}

创建一个二叉树并输出三种遍历结果

实验报告 课程名称数据结构 实验项目实验三--创建一个二叉树并输出三种遍历结果 系别■计算机学院 _________________ 专业_______________ 班级/学号_____________ 学生姓名___________ 实验日期— 成绩______________________________ 指导 教师

实验题目:实验三创建一个二叉树并输出三种遍历结果 实验目的 1)掌握二叉树存储结构; 2)掌握并实现二叉树遍历的递归算法和非递归算法; 3)理解树及森林对二叉树的转换; 4)理解二叉树的应用一哈夫曼编码及WPL计算。 实验内容 1)以广义表或遍历序列形式创建一个二叉树,存储结构自选; 2)输出先序、中序、后序遍历序列; 3)二选一应用题:1)树和森林向二叉树转换;2)哈夫曼编码的应用问题。 题目可替换上述前两项实验内容) 设计与编码 1)程序结构基本设计框架 (提示:请根据所选定题目,描述程序的基本框架,可以用流程图、界面描述图、 框图等来表示) 2)本实验用到的理论知识遍历二叉树,递归和非递归的方法 (应用型

(提示:总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,要求结合自己的题目并阐述自己的理解和想法) 3) 具体算法设计 1) 首先,定义二叉树的存储结构为二叉链表存储,每个元素的数 据类型Elemtype,定义一棵二叉树,只需定义其根指针。 2) 然后以递归的先序遍历方法创建二叉树,函数为CreateTree(),在输 入字符时要注意,当节点的左孩子或者右孩子为空的时候,应当输入一 个特殊的字符(本算法为“ #”),表示左孩子或者右孩子为空。 3) 下一步,创建利用递归方法先序遍历二叉树的函数,函数为 PreOrderTreeQ,创建非递归方法中序遍历二叉树的函数,函数为 InOrderTree(),中序遍历过程是:从二叉树的根节点开始,沿左子树 向下搜索,在搜索过程将所遇到的节点进栈;左子树遍历完毕后,从 栈顶退出栈中的节点并访问;然后再用上述过程遍历右子树,依次类 推,指导整棵二叉树全部访问完毕。创建递归方法后序遍历二叉树的 函数,函数为LaOrderTree()。 (提示:该部分主要是利用C、C++ 等完成数据结构定义、设计算法实现各种操作,可以用列表分步形式的自然语言描述,也可以利用流程图等描述) 4) 编码 #include #include #include typedef char DataType; #define MaxSize 100 typedef struct Node { DataType data; struct Node *lchild; struct Node *rchild; } *BiTree,BitNode;

二叉树遍历方法技巧

二叉树遍历方法 1.中序遍历的投影法 如果给定一棵二叉树的图形形态,是否能根据此图快速地得出其中序遍历的序列?回答是肯定的。具体做法是:首先按照二叉树的标准绘制二叉树形态,即将所有左子树都严格绘于根结点的左边;将所有右子树都严格绘于根结点的右边。然后假设现在有一个光源从该二叉树的顶部投射下来,那么所有结点在地平线上一定会有相应的投影,从左至右顺序读出投影结点的数据即为该二叉树的中序遍历序列。如图11.10所示。 图示的中序遍历序列: D J G B H E A F I C 2.先序遍历的填空法 如果给定一棵二叉树的图形形态,可在图形基础上,采用填空法迅速写出该二叉树的先序遍历序列。具体做法是:我们知道,对于每个结点都由三个要素组成,即根结点,左子树、右子树;又已知先序遍历顺序是先访问根结点、然后访问左子树、访问右子树。那么,我们按层分别展开,逐层填空即可得到该二叉树的先序遍历序列。 图11.10 中序遍历投影法示意图 如图11.10 中的二叉树采用填空法的步骤如下: (1)根结点左子树右子树 A( )( ) (2)A (根结点(左子树)(右子树))(根结点(左子树)(右子树)) A B C (3)A(B(根结点(左)(右))(根结点(左)(右)))(C(……)(……)) A B D 无 G E H 无 C F 无 (4)A B D G J E H C F I 此即为该二叉树的先序遍历序列。 注:后序遍历的序列亦可以此方法类推,请读者自己尝试。

3.利用遍历序列构造二叉树 如果已知一棵二叉树的先序遍历序列和中序遍历序列,则可以用这两个遍历序列构造一棵唯一的二叉树形态。我们知道任意一棵二叉树的先序遍历序列和中序遍历序列是唯一的,那么首先从给定的先序遍历序列入手,该先序序列的第一个元素一定是该二叉树的根;再分析这个根结点在中序遍历序列中的位置,中序遍历序列中根结点的左边即为左子树的全部元素,而根结点的右边即为右子树的全部元素;然后据此再将先序遍历序列除根结点以外的其余部分分为左、右子树两部分,并在这两部分中分别找出左、右子树的根结点。依此类推,即可得到完整的二叉树。例11.1 已知一棵二叉树的先序遍历和中序遍历序列分别为: 先序: A B C I D E F H G 中序: C I B E D A H F G 请构造这棵二叉树。 按前述分析,这棵二叉树的构造过程如图11.11所示 图11.11 二叉树的构造过程 树、森林与二叉树的转换(flash演示) 如前所述,树(或森林)的存储结构及其操作算法的实现,由于其“度”的不确定性而导致其存储结构不是较为复杂就是浪费空间,因而,定义在其存储结构上的算法也相应地较难兼顾全面。如果我们设定一定的规则,用二叉树来表示树和森林的话,就可以方便地解决树、森林的存储结构及其相关算法问题。 1.树、森林转换为二叉树 我们知道,一棵树中每个结点的孩子是无序的,而二叉树中各结点的孩子必须有左右之分。在此,为避免概念混淆,首先约定树中每个结点的孩子按从左至右的顺序升序编号,即将树中同一层上的兄弟分出大小。那么将一棵树转换成二叉树的方法是: (1)在树中同层兄弟间加一连线; (2)对树中每个结点仅保留其与长兄(左边第一个孩子)的连线,擦去其与其它孩子的连线; (3)以树(或子树)的根作为轴心,将所有的水平连线顺时针旋转45度,即可得到与该树完全等价的一棵二叉树。

数据结构——二叉树的操作(遍历及树形输出)

/*实验三:二叉树遍历操作验证*/ #include #include #include #include #include #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 int LeafNum;//叶子结点个数 //定义结构体 typedef struct BiTNode{ char data; //存放值 struct BiTNode *lchild,*rchild; //左右孩子 }BiTNode,*BiTree; //先序输入二叉树结点的值,空格表示空树 void createBiTree(BiTree &T) { char ch; //输入结点时用 scanf("%c",&ch); if(ch==' ') //若输入空格,该值为空,且没有左右孩子 { T=NULL; }else{ T=(BiTNode *)malloc(sizeof(BiTNode)); //分配结点空间 if(!T) //分配失败 { exit(OVERFLOW); } T->data=ch; //生成根结点 createBiTree(T->lchild); //构造左子树 createBiTree(T->rchild); //构造右子树 } } //递归方法先序遍历二叉树 void preOrderTraverse(BiTree T) {

if(T) //若非空 { if(T->data) { //输出 printf("%c",T->data); } preOrderTraverse(T->lchild); preOrderTraverse(T->rchild); } } //递归方法中序遍历二叉树 void inOrderTraverse(BiTree T) { if(T) //若非空 { preOrderTraverse(T->lchild); if(T->data) { //输出 printf("%c",T->data); } preOrderTraverse(T->rchild); } } //递归方法后序遍历二叉树 void postOrderTraverse(BiTree T) { if(T) //若非空 { preOrderTraverse(T->lchild); preOrderTraverse(T->rchild); if(T->data) { //输出 printf("%c",T->data); } } } //层序遍历二叉树 void LevelTraverse(BiTree T) { queue q;//建队 q.push(T);//根节点入队

二叉树的遍历(非递归)

实验三:二叉树的遍历问题 题目:编制一个遍历二叉树的程序 班级:姓名:学号:完成日期: 一.需求分析 1.问题描述:很多涉及二叉树的操作的算法都是以二叉树的遍历操作为基础的。编写程序,对一棵给定的二叉树进行先、中、后三种次序的遍历。 2.基本要求:以二叉链表为存储结构,实现二叉树的先、中、后三种次序的递归和非递归遍历。 3.测试数据:以教科书图6.9的二叉树为例。 4.实现提示: (1).设二叉树的结点不超过30个,且每个结点的数据均为字符,这样可利用先序遍历序列作为输入顺序创建二叉树链表存储结构。 (2.)也可利用完全二叉树在顺序存储中的特性,创建二叉树的存储结构,此时,二叉树中结点数据的类型不受限制。 二.概要设计 1.为实现上述功能,应先建立二叉树。为此,需要有一个二叉树的抽象数据类型。该抽象数据类型的定义为: ADT BinaryTree { 数据对象D:D是具有相同特性的数据元素的集合 termset中每个元素包含编号,密码,和一个指向下一节点的指针数据关系R: 若D=?,则R=?,称BinaryTree为空二叉树; 若D≠?,则R={H},H是如下二元关系: (1).在R中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2).若D-(root) ≠?, 则存在D-(root)={D1,D2},且D1∩D2=?; (3). D1≠?,则D1中存在唯一的元素x1,∈H,且存在D1上的关系 H1?H;若Dr≠?,则Dr中存在唯一的元素Xr, ∈H,且存在Dr上的关 系Hr?H;H={,,H1,Hr}; (4).(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一棵 符合本定义的二叉树,称为根的右子树。 基本操作P: createbt(BiTree& T) 操作结果:构造一棵空二叉树 PreOrder(BiTree T) 初始条件:二叉树T存在

二叉树的建立及遍历

数据结构实验五 课程数据结构实验名称二叉树的建立及遍历第页 专业班级学号 姓名 实验日期:年月日评分 一、实验目的 1.学会实现二叉树结点结构和对二叉树的基本操作。 2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。 二、实验要求 1.认真阅读和掌握和本实验相关的教材内容。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历并计算出二叉树的高度。 2 .编写程序生成下面所示的二叉树,并采用先序遍历的非递归算法对此二叉 树进行遍历。 四、实验步骤 (描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间结果) 第一题 #include "stdafx.h" #include"iostream.h" #include"stdlib.h"

#include"stdio.h" #includelchild); int n=depth(T->rchild); ?return (m>n?m:n)+1; } } //先序,中序建树 structnode*create(char *pre,char *ord,int n) { ?struct node*T; intm; T=NULL; ?if(n<=0) ?{ ?returnNULL; } ?else ?{ ?m=0; ??T=new(struct node); T->data=*pre; ?T->lchild=T->rchild=NULL; ?while(ord[m]!=*pre) ?m++; T->lchild=create(pre+1,ord,m); ?T->rchild=create(pre+m+1,ord+m+1,n-m-1);

数据结构课程设计_线索二叉树的生成及其遍历

数据结构课程设计 题目: 线索二叉树的生成及其遍历 学院: 班级: 学生姓名: 学生学号: 指导教师: 2012 年12月5日

课程设计任务书

摘要 针对以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而得不到结点的前驱与后继信息,为了使这种信息只有在遍历的动态过程中才能得到。增设两个指针分别指示其前驱和后继,但会使得结构的存储密度降低;并且利用结点的空链域存放(线索链表),方便。同时为了记下遍历过程中访问结点的先后关系,附设一个指针pre始终指向刚刚访问过的结点,若指针p 指向当前访问的结点,则 pre指向它的前驱。由此得到中序遍历建立中序线索化链表的算法 本文通过建立二叉树,实现二叉树的中序线索化并实现中序线索二叉树的遍历。实现对已生成的二叉树进行中序线索化并利用中序线索实现对二叉树的遍历的效果。 关键词二叉树,中序线索二叉树,中序线索二叉树的遍历

目录 摘要 ............................................ 错误!未定义书签。第一章,需求分析................................. 错误!未定义书签。第二章,概要设计 (1) 第三章,详细设计 (2) 第四章,调试分析 (5) 第五章,用户使用说明 (5) 第六章,测试结果 (5) 第七章,绪论 (6) 第八章,附录参考文献 (7)

线索二叉树的生成及其遍历 第一章需求分析 以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而得不到结点的前驱与后继信息,为了使这种信息只有在遍历的动态过程中才能得到。增设两个指针分别指示其前驱和后继,但会使得结构的存储密度降低;并且利用结点的空链域存放(线索链表),方便。同时为了记下遍历过程中访问结点的先后关系,附设一个指针pre始终指向刚刚访问过的结点,若指针p 指向当前访问的结点,则 pre指向它的前驱。由此得到中序遍历建立中序线索化链表的算法 本文通过建立二叉树,实现二叉树的中序线索化并实现中序线索二叉树的遍历。实现对已生成的二叉树进行中序线索化并利用中序线索实现对二叉树的遍历的效果。主要任务: 1.建立二叉树; 2.将二叉树进行中序线索化; 3.编写程序,运行并修改; 4.利用中序线索遍历二叉树 5.书写课程设计论文并将所编写的程序完善。 第二章概要设计 下面是建立中序二叉树的递归算法,其中pre为全局变量。 BiThrNodeType *pre; BiThrTree InOrderThr(BiThrTree T) { /*中序遍历二叉树T,并将其中序线索化,pre为全局变量*/ BiThrTree head; head=(BitThrNodeType *)malloc(sizeof(BiThrType));/*设申请头结点成功*/ head->ltag=0;head->rtag=1;/*建立头结点*/ head->rchild=head;/*右指针回指*/ if(!T)head->lchild=head;/*若二叉树为空,则左指针回指*/ else{head->lchild=T;pre=head; InThreading(T);/*中序遍历进行中序线索化*/ pre->rchild=head; pre->rtag=1;/*最后一个结点线索化*/ head->rchild=pre; }; return head; } void InThreading(BiThrTree p) {/*通过中序遍历进行中序线索化*/ if(p)

数据结构C语言实现二叉树三种遍历

实验课题一:将下图中得二叉树用二叉链表表示: 1用三种遍历算法遍历该二叉树,给出对应得输出结果; 2写一个函数对二叉树搜索,若给出一个结点,根据其就是否属于该树,输出true或者f alse。 3写函数完成习题4、31(C++版)或4、28(C版教科书)。 #include "stdio、h" #include”malloc、h" typedefstruct BiTNode { char data; structBiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree Create(BiTreeT) { char ch; ch=getchar(); if(ch=='#’) T=NULL; else { T=(BiTNode *)malloc(sizeof(BiTNode)); T-〉data=ch; T->lchild=Create(T—〉lchild); T—〉rchild=Create(T-〉rchild); } return T; } int node(BiTree T) { int sum1=0,a,b; ?if(T) { if(T!=NULL) ??sum1++;

?a=node(T->lchild); sum1+=a; b=node(T—>rchild); sum1+=b; ?} return sum1; } int mnode(BiTree T) { ?int sum2=0,e,f; if(T) { ?if((T->lchild!=NULL)&&(T-〉rchild!=NULL))?sum2++; ?e=mnode(T-〉lchild); sum2+=e; f=mnode(T-〉rchild); sum2+=f; ?} return sum2; } void Preorder(BiTree T) { if(T) { printf("%c”,T->data); Preorder(T—>lchild); Preorder(T-〉rchild); } } int Sumleaf(BiTree T) { int sum=0,m,n; if(T) { if((!T-〉lchild)&&(!T-〉rchild)) sum++; m=Sumleaf(T->lchild); sum+=m; n=Sumleaf(T—>rchild); sum+=n; } return sum; }

二叉树的建立及几种简单的遍历方法

#include "stdio.h" #include "stdlib.h" #define STACK_INIT_SIZE 100 //栈存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 //------二叉树的存储结构表示------// typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //-----顺序栈的存储结构表示------// typedef struct{ BiTree *top; BiTree *base; int stacksize; }SqStack; //*************************************************** //构造一个空栈s SqStack *InitStack(); //创建一颗二叉树 BiTree CreatBiTree(); //判断栈空 int StackEmpty(SqStack *S); //插入元素e为新的栈顶元素 void Push(SqStack *S,BiTree p); //若栈不为空,则删除s栈顶的元素e,将e插入到链表L中void Pop(SqStack *S,BiTree *q); //非递归先序遍历二叉树 void PreOrderTraverse(BiTree L); //非递归中序遍历二叉树 void InOrderTraverse(BiTree L); //非递归后序遍历二叉树 void PostOrderTraverse(BiTree L); //递归后序遍历二叉树 void PostOrder(BiTree bt); //递归中序遍历二叉树 void InOrder(BiTree bt); //递归先序遍历二叉树 void PreOrder(BiTree bt); //***************************************************

二叉树的随机生成及其遍历

叉树的随机生成及其遍历 张 zhaohan 10804XXXXX 2010/6/12 问题重述 利用随机函数产生50个(不大于1 00且各不相同的)随机整数,用这些整数来生成一棵二叉树,分别对二叉树 进行先根遍历,中根遍历和后根遍历并输出树中结点元素序列。 程序设计 (一) 需求分析: ?问题的定义与要求: 1 、产生50个不大于100且各不相同的随机整数 (由系统的随机函数生成并 对100取模);2、先根遍历并输出结果;3、中根遍历并输出结果;4、后根遍历并输出结果;按层次浏览二叉树结 5、点; 6、退出程序。 ?俞入:所需功能,选项为1?6。 ?输出:按照用户功能选择输出结果。 ?限制:输入的功能选择在1?6之间,否则无回应。 ?模块功能及要求: RandDif(): 生成50个随机不大于100的整数,每次生成不同随机整数。 CreateBitree(): 给数据结点生成二叉树,使每个结点的左右儿子指针指向左右儿子。 NRPreOrder(): 非递归算法的先根遍历。 inOrderTraverse(): 递归算法的中根遍历。 P ostOrderTraverseO:递归算法的后根遍历。 Welcome(): 欢迎窗口。 Menu():菜单。 Goodbye():再见窗口。 (二) 概要设计:

首先要生成二叉树,由于是对随机生成的50个数生成二叉树,故可以采取顺序存储的方式,对结点的左右儿子进行赋值。生成的二叉树是完全二叉树。 先根遍历的非递归算法: 1、根结点进栈 2、结点出栈,被访问 3、结点的右、左儿子(非空)进栈 4、反复执行2、3 ,至栈空为止。 先根遍历的算法流程图:根结点进栈( a[0]=T->boot,p=a[0] ) 访问结点printf(*p) 右儿子存在则进栈a[i]=(*p).rchild; i++; 左儿子存在则进栈a[i]=(*p).rchild; i++; 栈顶降低top--:i--;p=a[i]; 栈非空while(i>-1) 返回 中根遍历的递归算法流程图: T为空 Return; inOrderTraverse(T->lchild) Printf(T->data) inOrderTraverse(T->rchild) 返回

二叉树的建立和遍历的实验报告

竭诚为您提供优质文档/双击可除二叉树的建立和遍历的实验报告 篇一:二叉树遍历实验报告 数据结构实验报告 报告题目:二叉树的基本操作学生班级: 学生姓名:学号: 一.实验目的 1、基本要求:深刻理解二叉树性质和各种存储结构的特点及适用范围;掌握用指针类型描述、访问和处理二叉树的运算;熟练掌握二叉树的遍历算法;。 2、较高要求:在遍历算法的基础上设计二叉树更复杂操作算法;认识哈夫曼树、哈夫曼编码的作用和意义;掌握树与森林的存储与便利。二.实验学时: 课内实验学时:3学时课外实验学时:6学时三.实验题目 1.以二叉链表为存储结构,实现二叉树的创建、遍历(实验类型:验证型)1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能:1…建立树2…前序

遍历树3…中序遍历树4…后序遍历树5…求二叉树的高度6…求二叉树的叶子节点7…非递归中序遍历树0…结束2)实验要求:在程序中定义下述函数,并实现要求的函数功能:createbinTree(binTree structnode*lchild,*rchild; }binTnode;元素类型: intcreatebinTree(binTree voidpreorder(binTreevoidInorder(binTree voidpostorder(binTreevoidInordern(binTreeintleaf(bi nTree intpostTreeDepth(binTree 2、编写算法实现二叉树的非递归中序遍历和求二叉树高度。1)问题描述:实现二叉树的非递归中序遍历和求二叉树高度2)实验要求:以二叉链表作为存储结构 3)实现过程: 1、实现非递归中序遍历代码: voidcbiTree::Inordern(binTreeinttop=0;p=T;do{ while(p!=nuLL){ stack[top]=p;;top=top+1;p=p->lchild;}; if(top>0){ top=top-1;p=stack[top];

数据结构二叉树的创建及遍历

课程名称:数据结构实验 实验项目:二叉树的创建及遍历 姓名: 专业:计算机科学与技术 班级: 学号: 计算机科学与技术学院 20 17年11 月22 日

哈尔滨理工大学计算机科学与技术学院实验报告 实验项目名称:二叉树的建立及遍历 一、实验目的 1.熟悉掌握课本二叉树相关理论知识 2.实践与理论相结合,掌握二叉树的应用程序 3.学会二叉树的创建,遍历等其他基本操作的代码实现 二、实验内容 1.二叉树的创建代码实现 2.二叉树先序、中序、后序遍历代码实现 三、实验操作步骤 1.二叉树的建立 (1)树节点的定义 由于每个节点都由数据域和指左子树和右子树的指针,故结构体封装如下: typedef struct node { int data; struct node *left; struct node *right; }Tree,*bitree; (2)建立 采用递归的思想,先建立根再建立左子树,再建立右子树。递归截止条件子树为空,用-1代表树空 *T=(struct node *)malloc(sizeof(struct node));

(*T)->data=a; printf("%d的左节点",a); create(&(*T)->left); printf("%d的右节点",a); create(&(*T)->right); 2.三种遍历的实现 (1)先序遍历 依旧采用递归的思想,先遍历根后遍历左子树再遍历右子树。 printf("%d ",T->data); Pro(T->left); Pro(T->right); (2)中序遍历 先遍历左子树再遍历根最后遍历右子树 Mid(T->left); printf("%d ",T->data); Mid(T->right); (3)后序遍历 先遍历左子树再遍历右子树最后遍历根 Later(T->left); Later(T->right); printf("%d ",T->data); (4)按层遍历 按层遍历采用队列的思想,先将第一个节点入队然后在将其出队将其左右孩子入队。依

数据结构二叉树遍历及线索化后各种操作(绝对无错)

实验二二叉树的存储结构及各种运算的实现第一题: #include "stdio.h" #include "malloc.h" #define maxsize 66 typedef int datatype; typedef struct node { datatype data ; struct node *lchild,*rchild; } bitree; bitree *Q[maxsize]; bitree *creatree() { char ch; int front,rear; bitree *root,*s; root=NULL; front=1;rear=0; ch=getchar(); while (ch!='#') { s=NULL; if(ch!='@') { s=malloc(sizeof(bitree)); s->data=ch; s->lchild=NULL; 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(); } return root; } preorder(bitree *t) //前{ if (t) { printf(" %c ",t->data); preorder(t->lchild); preorder(t->rchild); } } inorder(bitree *t) //中{ if (t) { inorder(t->lchild); printf(" %c ",t->data); inorder(t->rchild); } } postorder(bitree *t) //后{ if (t) { postorder(t->lchild); postorder(t->rchild); printf(" %c ",t->data); } } int height(bitree *t) //高度{ int hl,hr; if(!t) return 0; else { hl=height(t->lchild); hr=height(t->rchild); return ((hl>hr?hl:hr)+1); } }

二叉树遍历算法的实现

二叉树遍历算法的实现 题目:编制二叉树遍历算法的实现的程序 一.需求分析 1.本演示程序中,二叉树的数据元素定义为非负的整型(unsigned int)数据,输 入-1表示该处没有节点 2.本演示程序输入二叉树数据均是按先序顺序依次输入 3.演示程序以用户和计算机对话方式执行,即在计算机终端上显示“提示信息” 之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运 算结果显示在其后 4.本实验一共包括三个主要程序,分别是:1)二叉树前序,中序,后序遍历递归 算法实现2)二叉树前序中序遍历非递归算法实现3)二叉树层次遍历算法实现 5.本程序执行命令包括:1)构建二叉树2)二叉树前序递归遍历3)二叉树中序 递归遍历4)二叉树后序递归遍历5)二叉树前序非递归遍历6)二叉树中序非 递归遍历7)二叉树层次遍历 6.测试数据 (1)7 8 -1 9 10 -1 -1 -1 6 11 -1 -1 12 13 -1 -1 14 -1 -1 (2)1 -1 -1 (3)7 8 -1 -1 9 -1 -1 二.概要设计 1.为实现二叉树的遍历算法,我们首先给出如下抽象数据类型 1)二叉树的抽象数据类型 ADT BiTree{ 数据对象D:D是具有相同特性的数据元素的集合 数据关系R: 若D=Φ,则R=Φ,称BiTree是空二叉树; 若D≠Φ,则R={H},H是如下二元关系: (1)在D中存在唯一的成为根的数据元素root,它在关系H下无前驱; (2)若D-{H}≠Φ,则存在D-{root}={D1,D r},且D1∩D r=Φ (3)若D1≠Φ,则D1中存在唯一的元素x1,∈H,且存在D1上的 关系H1?H;若Dτ≠Φ,则D r中存在唯一的元素x r,∈ H,且存在D r上的关系H r?H;H={,,H1,H r}; (4)(D1,{H1})是符合本定义的二叉树,成为根的左子树,(D r,{H r})是 一颗符合本定义的二叉树,成为根的右字树。 基本操作P: InitBiTree(&T); 操作结果:构造空二叉树 DestroyBiTree(&T) 初始条件;二叉树存在 操作结果:销毁二叉树 CreateBiTree(&T,definition);

树的存储结构、遍历;二叉树的定义、性质、存储结构、遍历以及树、森林、二叉树的转换

树和二叉树 树与二叉树是本书的重点内容之一,知识点多且比较零碎。其中二叉树又是本章的重点。 在本章中我们要了解树的定义、熟悉树的存储结构、遍历;二叉树的定义、性质、存储结构、遍历以及树、森林、二叉树的转换。哈夫曼树及哈夫曼编码等内容。 算法的重点是二叉树的遍历及其应用。 6.1 树的定义 一、树的定义 树:树是n(n>0)个结点的有限集合T。一棵树满足下列条件: (1)有且仅有一个称为根的结点; (2)其余结点可分为m(m>=0)棵互不相交的有限集合T1,T2,T3,…Tm, 其中每个集合又是一棵树,并称之为根的子树。 有关树的一些基本概念: 1)结点的度:树中每个结点具有的子树数目或后继结点数。 如图中结点A的度为2,B的度为3 2) 树的度:所有结点的度的最大值为树的度。 (图中树的度为3) 3) 分支结点:即:树中所有度大于0的结点。 4) 叶子结点:即:树中度为零的结点,也称为终端结点。 5) 孩子结点:一个结点的后续结点称为该结点的孩子结点。 6) 双亲结点:一个结点为其后继结点的双亲结点。 7) 子孙结点:一个结点的所有子树中的结点为该结点的子孙结点。 8) 祖先结点:从根结点到一个结点的路径上所有结点(除自己外) 称为该结点的祖先结点。(如A和B为D结点的祖先结点) 9) 兄弟结点:具有同一父亲的结点互相为兄弟结点。(如B和C为兄弟结点) 10) 结点的层数:从根结点到该结点的路径上的结点总数称为该结点的层数(包括该结点)。 11) 树的深度(高度):树中结点的最大层数为树的深度。(图中树的深度为4) 12) 森林:0个或多个互不相交的树的集合。 上图中:树的度为3,树的深度为4。 结点A,B,C,D,E,F,G,H,I,J的度分别为:2, 3, 2, 0 ,2 , 0, 0, 0, 0, 0 叶结点有:D, F, G, H, I, J B,C为兄弟,D, E, F为兄弟,F, G为兄弟。I,J为兄弟。 二、树的表示 1. 树的逻辑结构描述 Tree=(D,R) 其中:D为具有相同性质的数据元素的集合。 R为D上元素之间的关系集合。 如上图中的树: D=(A,B,C,D,E,F,G,H,I,J) R={,,,,,,,,} 2. 树的逻辑表示方法: (1)树形表示法:如一棵倒立的树,从根结点开始一层层向下扩展,根结点在上,叶结点在下。

数据结构实验报告-二叉树的实现与遍历

《数据结构》第六次实验报告 学生姓名 学生班级 学生学号 指导老师

一、实验内容 1) 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序 以及按层次遍历的操作,求所有叶子及结点总数的操作。 2) 输出树的深度,最大元,最小元。 二、需求分析 遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。 递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。直到递归全部结束。 下面重点来讲述非递归方法: 首先介绍先序遍历: 先序遍历的顺序是根左右,也就是说先访问根结点然后访问其左子再然后访问其右子。具体算法实现如下:如果结点的指针不为空,结点指针入栈,输出相应结点的数据,同时指针指向其左子,如果结点的指针为空,表示左子树访问结束,栈顶结点指针出栈,指针指向其右子,对其右子树进行访问,如此循环,直至结点指针和栈均为空时,遍历结束。 再次介绍中序遍历: 中序遍历的顺序是左根右,中序遍历和先序遍历思想差不多,只是打印顺序稍有变化。具体实现算法如下:如果结点指针不为空,结点入栈,指针指向其左子,如果指针为空,表示左子树访问完成,则栈顶结点指针出栈,并输出相应结点的数据,同时指针指向其右子,对其右子树进行访问。如此循环直至结点指针和栈均为空,遍历结束。 最后介绍后序遍历: 后序遍历的顺序是左右根,后序遍历是比较难的一种,首先需要建立两个栈,一个用来存放结点的指针,另一个存放标志位,也是首先访问根结点,如果结点的指针不为空,根结点入栈,与之对应的标志位也随之入标志位栈,并赋值0,表示该结点的右子还没有访问,指针指向该结点的左子,如果结点指针为空,表示左子访问完成,父结点出栈,与之对应的标志位也随之出栈,如果相应的标志位值为0,表示右子树还没有访问,指针指向其右子,父结点再次入栈,与之对应的标志位也入栈,但要给标志位赋值为1,表示右子访问过。如果相应的标志位值为1,表示右子树已经访问完成,此时要输出相应结点的数据,同时将结点指针赋值为空,如此循环直至结点指针和栈均为空,遍历结束。 三、详细设计 源代码:

二叉树三种遍历算法代码_

二叉树三种遍历算法的源码 二叉树三种遍历算法的源码背诵版 本文给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法,直接用于考研答题。 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; }SqStack; void PreOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { while (p!=null) //遍历左子树 { visite(p->data); push(s,p); p=p->lchild; }//endwhile if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历 { p=pop(s); p=p->rchild; }//endif }//endwhile }//PreOrderUnrec 2.中序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize];

int top; }SqStack; void InOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { while (p!=null) //遍历左子树 { push(s,p); p=p->lchild; }//endwhile if (!StackEmpty(s)) { p=pop(s); visite(p->data); //访问根结点 p=p->rchild; //通过下一次循环实现右子树遍历}//endif }//endwhile }//InOrderUnrec 3.后序遍历非递归算法 #define maxsize 100 typedef enum{L,R} tagtype; typedef struct { Bitree ptr; tagtype tag; }stacknode; typedef struct { stacknode Elem[maxsize]; int top; }SqStack; void PostOrderUnrec(Bitree t)

二叉树的遍历实验报告

二叉树的遍历实验报告 一、需求分析 在二叉树的应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理,这就是二叉树的遍历问题。 对二叉树的数据结构进行定义,建立一棵二叉树,然后进行各种实验操作。 二叉树是一个非线性结构,遍历时要先明确遍历的规则,先访问根结点还时先访问子树,然后先访问左子树还是先访问有右子树,这些要事先定好,因为采用不同的遍历规则会产生不同的结果。本次实验要实现先序、中序、后序三种遍历。 基于二叉树的递归定义,以及遍历规则,本次实验也采用的是先序遍历的规则进行建树的以及用递归的方式进行二叉树的遍历。 二、系统总框图

三、各模块设计分析 (1)建立二叉树结构 建立二叉树时,要先明确是按哪一种遍历规则输入,该二叉树是按你所输入的遍历规则来建立的。本实验用的是先序遍历的规则进行建树。 二叉树用链表存储来实现,因此要先定义一个二叉树链表存储结构。因此要先定义一个结构体。此结构体的每个结点都是由数据域data 、左指针域Lchild 、右指针域Rchild 组成,两个指针域分别指向该结点的左、右孩子,若某结点没有左孩子或者右孩子时,对应的指针域就为空。最后,还需要一个链表的头指针指向根结点。 要注意的是,第一步的时候一定要先定义一个结束标志符号,例如空格键、#等。当它遇到该标志时,就指向为空。 建立左右子树时,仍然是调用create ()函数,依此递归进行下去,

直到遇到结束标志时停止操作。 (2)输入二叉树元素 输入二叉树时,是按上面所确定的遍历规则输入的。最后,用一个返回值来表示所需要的结果。 (3)先序遍历二叉树 当二叉树为非空时,执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。 (4)中序遍历二叉树 当二叉树为非空时,程序执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。 (5)后序遍历二叉树 当二叉树为非空时,程序执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。 (6)主程序 需列出各个函数,然后进行函数调用。 四、各函数定义及说明 因为此二叉树是用链式存储结构存储的,所以定义一个结构体用以存储。 typedef struct BiTNode { char data; struct BiTNode *Lchild; struct BiTNode *Rchild;

相关文档
最新文档