当前位置:文档之家› 用递归和非递归算法实现二叉树的三种遍历

用递归和非递归算法实现二叉树的三种遍历

○A ○C○D ○B○E○F○G《数据结构与算法》实验报告三——二叉树的操作与应用一.实验目的熟悉二叉链表存储结构的特征,掌握二叉树遍历操作及其应用二. 实验要求(题目)说明:以下题目中(一)为全体必做,(二)(三)任选其一完成(一)从键盘输入二叉树的扩展先序遍历序列,建立二叉树的二叉链表存储结构;(二)分别用递归和非递归算法实现二叉树的三种遍历;(三)模拟WindowsXP资源管理器中的目录管理方式,模拟实际创建目录结构,并以二叉链表形式存储,按照凹入表形式打印目录结构(以扩展先序遍历序列输入建立二叉链表结构),如下图所示: (基本要求:限定目录名为单字符;扩展:允许目录名是多字符组合)三. 分工说明一起编写、探讨流程图,根据流程图分工编写算法,共同讨论修改,最后上机调试修改。

四. 概要设计实现算法,需要链表的抽象数据类型:ADT Binarytree {数据对象:D是具有相同特性的数据元素的集合数据关系R:若D为空集,则R为空集,称binarytree为空二叉树;若D不为空集,则R为{H},H是如下二元关系;(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;(2)若D-{root}不为空,则存在D-{root}={D1,Dr},且D1∩Dr为空集;(3)若D1不为空,则D1中存在唯一的元素x1,<root,x1>∈H,且存在D1上的关系H1是H的子集;若Dr不为空集,则Dr中存在唯一的元素Xr,<root,Xr>∈H,且存在Dr上的关系Hr为H的子集;H={<root,x1>,<root,Xr>,H1,Hr};(4) (D1,{H1})是一颗符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一颗符合本定义的二叉树,称为根的右子树。

基本操作:Creatbitree(&S,definition)初始条件:definition给出二叉树S的定义操作结果:按definition构造二叉树Scounter(T)初始条件:二叉树T已经存在操作结果:返回二叉树的总的结点数onecount(T)初始条件:二叉树T已经存在操作结果:返回二叉树单分支的节点数Clearbintree(S)初始条件:二叉树S已经存在操作结果:将二叉树S清为空树Bitreeempty(S)初始条件:二叉树S已经存在操作结果:若S为空二叉树,则返回TRUE,否则返回FALSEBitreedepth(S,&e)初始条件:二叉树S已经存在操作结果:返回S的深度Parent(S)初始条件:二叉树S已经存在,e是S中的某个结点操作结果:若e是T的非根结点,则返回它的双亲,否则返回空Preordertraverse(S)初始条件:二叉树S已经存在,Visit是对结点操作的应用函数。

操作结果:先序遍历S,对每个结点调用函数visit一次且仅一次。

一旦visit失败,则操作失败。

Inordertraverse (S,&e)初始条件:二叉树S已经存在,Visit是对结点操作的应用函数。

操作结果:中序遍历S,对每个结点调用函数visit一次且仅一次。

一旦visit失败,则操作失败。

Postordertraverse (&S,e)初始条件:二叉树S已经存在,Visit是对结点操作的应用函数。

操作结果:后序遍历S,对每个结点调用函数visit一次且仅一次。

一旦visit失败,则操作失败。

}ADT Binarytree五、详细设计扩展先序遍历:# include<stdio.h># include<stdlib.h>#include<string.h>typedef struct binarytree{char data;struct binarytree *lchild,*rchild;}BiTreeNode,*BiTree;void CreateBiTree(BiTree *bt){char ch;ch=getchar();if(ch=='.') *bt=NULL;else{*bt=(BiTreeNode *)malloc(sizeof(BiTreeNode));(*bt)->data=ch;CreateBiTree(&((*bt)->lchild));CreateBiTree(&((*bt)->rchild));}}void PreOder(BiTree root){if(root!=NULL){printf("%4c",root->data);PreOder(root->lchild);PreOder(root->rchild);}}main(){BiTree root;CreateBiTree(&root);printf("先序遍历:\n");PreOder(root);}递归算法:#include"stdio.h"#define PR printf#define ERROR 0#define MAX 100/*============================建立各结构体===============================*/ typedef struct node{char data; /*数据域*/struct node *lchild;struct node *rchild; /*结点的左右指针,分别指向结点的左右孩子*/}BTNode;typedef BTNode *DataType;typedef struct{DataType data[MAX];int top;}SeqStack;SeqStack *s;/*============================栈的操作===================================*/SeqStack *createemptystacks() /*创建一个空栈*/{SeqStack *s;s=(SeqStack*)malloc(sizeof(SeqStack));s->top=0;return s;}int stackemptys(SeqStack *s) /*判栈空*/{return s->top==0;}int stackfulls(SeqStack *s) /*判栈满*/{return s->top==MAX;}void pushs(SeqStack *s,DataType x) /*进栈*/{if(stackfulls(s))PR("over flow\n");elses->data[s->top++]=x;}void pops(SeqStack *s) /*退栈*/{if(stackemptys(s))PR("underflow\n");elses->top--;}DataType gettops(SeqStack *s) /*栈非空时取栈顶元素*/{return s->data[s->top-1];}/*============================建立二叉树==================================*/BTNode *createbintree() /*输入扩充的先序序列,建立二叉树*/ {BTNode *t;char x;scanf("%c",&x);if(x=='#')t=NULL; /*读入#,返回空指针 */else{t=(BTNode *)malloc(sizeof(BTNode)); /*生成结点*/ t->data=x;t->lchild=createbintree(); /*构造左子树*/t->rchild=createbintree(); /*构造右子树*/ }return(t);}/*==============================树的遍历===================================*/void preorder(BTNode *t) /*NLR 先序遍历*/{if(t!=NULL){PR(" %c\t",t->data); /*访问结点*/preorder(t->lchild); /*中序遍历左子树*/preorder(t->rchild); /*中序遍历右子树*/}}/*========================================================================= */void inorder(BTNode *t) /*LNR 中序遍历*/{if(t!=NULL){inorder(t->lchild); /*中序遍历左子树*/PR(" %c\t",t->data); /*访问结点*/inorder(t->rchild); /*中序遍历右子树*/}}/*========================================================================= */void postorder(BTNode *t) /*LRN 后序遍历*/{if(t!=NULL){postorder(t->lchild); /*后序遍历左子树*/postorder(t->rchild); /*后序遍历右子树*/PR(" %c\t",t->data); /*访问结点*/}}/*===============================主函数=============================-=======*/void main(){BTNode *t;int n=0;PR(" ->> 请输入二叉树各元素:(例如 abd##e##cf##g##)\n"); //例如abd##e##cf##g##t=createbintree();PR("\n\n ->> 1.按先序遍历输出为:\n");preorder(t); /*NLR 先序遍历*/PR("\n 按中序遍历输出为:\n");inorder(t); /*LNR 中序遍历*/PR("\n 按后序遍历输出为:\n");postorder(t); /*LRN 后序遍历*/}# include<stdio.h># include<stdlib.h># include<string.h># define TRUE 1# define FALSE 0# define Stack_Size 50# define NUM 20typedef struct binarytree /*定义一棵二叉树*/{char data;struct binarytree *LChild,*RChild;}BiTNode,*BiTree;typedef struct /*定义顺序栈S*/{BiTree data[Stack_Size];int top;}SeqStack;void CreateBiTree(BiTree &bt) /*利用“扩展先序遍历”创建二叉链表*/{char ch;ch=getchar(); /*调用getchar函数,需要用户输入字符,用户按回车键结束输入*/if(ch=='.') bt=NULL;else{bt=(BiTNode *)malloc(sizeof(BiTNode));bt->data=ch;CreateBiTree(bt->LChild);CreateBiTree(bt->RChild);}}void InitStack(SeqStack &S) /*初始化顺序栈S*/ {S.top=-1;}int IsEmpty(SeqStack S) /*判栈空*/{return(S.top==-1? TRUE:FALSE);}int Push(SeqStack &S,BiTree &x) /*进栈*/{if(S.top==Stack_Size-1)return(FALSE);S.top++;S.data[S.top]=x;return(TRUE);}int Pop(SeqStack &S,BiTree &x) /*出栈*/{if(S.top==-1)return(FALSE);else{x=S.data[S.top];S.top--;return(TRUE);}}void PreOrder(BiTree root) /*先序遍历非递归*/ {BiTNode *p;SeqStack S;p=root;InitStack(S);while(p!=NULL||!IsEmpty(S)){while(p!=NULL){printf("%4c",p->data);Push(S,p);p=p->LChild;}if(IsEmpty(S))return;Pop(S,p);p=p->RChild;}}void InOrder(BiTree root) /*中序遍历非递归*/{BiTNode *p;SeqStack S;InitStack(S);p=root;while(p!=NULL || ! IsEmpty(S)){if(p!=NULL){Push(S,p);p=p->LChild;}else{Pop(S,p);printf("%4c",p->data);p=p->RChild;}}}void PostOrder(BiTree root) /*后序遍历非递归*/{BiTNode *p,*q;BiTNode **S;int top=0;q=NULL;p=root;S=(BiTNode**)malloc(sizeof(BiTNode*)*NUM); /*NUM为预定义的常数*/ while(p!=NULL || top!=0){while(p!=NULL){top++;S[top]=p;p=p->LChild;}if(top>0){p=S[top];if((p->RChild==NULL)||(p->RChild==q)){printf("%4c",p->data);q=p;top--;p=NULL;}elsep=p->RChild;}}free(S);}void main() /*主函数部分*/{loop:BiTree root=NULL;CreateBiTree(root);printf("PreOrder traversal is:\n");PreOrder(root);printf("\n");printf("InOrder traversal is:\n");InOrder(root);printf("\n");printf("PostOrder traversal is:\n");PostOrder(root);printf("\n");printf("Please input a new one:\n");char c=getchar();goto loop;}实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法或算法流程图。

相关主题