淘豆网
1/23
下载文档
0/100
您的浏览器不支持进度条
更多>>该用户其他文档
下载所得到的文件列表
数据结构课程设计二叉树的创建和遍历.doc
文档介绍:
安徽工程大学数据结构课程设计说明书学生姓名: 刘超学号: 3120702109 学院: 计算机与信息学院专业: 信息与计算科学题目: 二叉树的创建和遍历指导教师潘海玉 201 4年8月25日目录 1. 需求分析----------------------- 1 2. 概要设计----------------------- 1 3. 详细设计----------------------- 3 4. 调试分析----------------------- 9 5. 课程总结----------------------- 10 6. 附录----------------------- 12 第 1页 1. 需求分析问题描述: 根据运行时输入的先序序列, 创建一棵二叉树, 分别对其进行先序、中序、后序、层序遍历,并显示遍历结果。 void CreateBTree(BTree &T) // 按先序次序输入, 构造二叉树 void PreOrder(BTree T) // 递归先序遍历 void InOrder(BTree T) // 递归中序遍历 void PostOrder(BTree T) // 递归后序遍历 void LevelOrder(BTree T) // 层序遍历 void NRPreOrder(BTree bt) // 非递归先序遍历 void NRInOrder(BTree bt) // 非递归中序遍历 void NRPostOrder(BTree bt) // 非递归后序遍历 void main() // 二叉树的建立与遍历实现 2. 概要设计此次课程设计遍历算法的框架图遍历算法递归遍历非递归遍历先序遍历中序遍历后序遍历先序遍历中序遍历后序遍历层序遍历第 2页此次课程设计所用的三组二叉树本设计所使用的存储结构: typedef char ElemType;// 定义二叉树结点值的类型为字符型 typedef struct bnode{// 二叉链表结构定义 ElemType data; struct bnode *lchild,*rchild; }Bnode,* BTree; typedef struct { BTree ptr; int tag; ABD CFH G EF A BD C A B F EG CDH E第 3页}stacknode; 3. 详细设计 void CreateBTree(BTree &T){// 按先序次序输入, 构造二叉链表表示的二叉树 T,# 表示空树 char ch; ch=getchar(); if(ch=='#') T=NULL;// 读入# 时,将相应节点指针置空 else{ if(!(T=(Bnode *)malloc(sizeof(Bnode)))) printf(" 创建失败!");// 生成结点空间 T->data=ch; CreateBTree(T->lchild);// 构造二叉树的左子树 CreateBTree(T->rchild);// 构造二叉树的右子树}} void PreOrder(BTree T){// 递归先序遍历 if(T){ printf("%c ",T->data); PreOrder(T->lchild); PreOrder(T->rchild); 第 4页}} void InOrder(BTree T){// 递归中序遍历 if(T){ InOrder(T->lchild); printf("%c ",T->data); InOrder(T->rchild); }} void PostOrder(BTree T){// 递归后序遍历 if(T){ PostOrder(T->lchild); PostOrder(T->rchild); printf("%c ",T->data); }} void LevelOrder(BTree T){// 层序遍历 BTree Q[MAX]; int front=0,rear=0; 第 5页 BTree p; if(T){ // 根结点入队 Q[rear]=T; rear=(rear+1)%MAX; } while(front!=rear){ p=Q[front]; // 队头元素出队 front=(front+1)%MAX; printf("%c ",p->data); if(p->lchild){ // 左孩子不为空,入队 Q[rear]=p->lchild; rear=(rear+1)%MAX; } if(p->rchild){ // 右孩子不为空,入队 Q[rear]=p->rchild; rear=(rear+1)%MAX; }}} void NRPreOrder(BTree bt){// 非递归先序遍历 BTree stack[MAX],p; 第 6页 int top; if (bt!=NULL){ top=0; p=bt; while(p!=NULL||top>0){ while(p!=NULL){ printf("%c",p->data); stack[top]=p;// 预留 p 指针在数组中 top++; p=p->lchild; } if (top>0){ top--; p=stack[top]; p=p->rchild;///* 左子树为空,进右子树*/ }}}} void NRInOrder(BTree bt){// 非递归中序遍历 BTree stack[MAX],p; 第 7页 int top; if (bt!=NULL){ top=0; p=bt; while(p!=NULL||top>0){ while(p!=NULL){ stack[top]=p; //预留 p 指针在数组中 top++; p=p->lchild; } if (top>0){ top--; p=stack[top]; printf("%c",p->data); p=p->rchild;/* 左子树为空,进右子树*/ }}}} void NRPostOrder(BTree bt){// 非递归后序遍历 stacknode s[MAX],x; 第 8页 BTree p=bt; int top; if(bt!=NULL){ top=0; p=bt; do{ while (p!=NULL){ // 遍历左子树 s[top].ptr = p; s[top].tag = 1; // 标记为左子树 top++; p=p->lchild; } while (top>0 && s[top-1].tag==2){ x= s[--top]; p= x.ptr; printf("%c",p->data); //tag 为R ,表示右子树访问完毕,故访问根结点} if (top>0){ s[top-1].tag =2; // 遍历右子树 p=s[top-1].ptr->rchild; } 内容来自淘豆网www.taodocs.com转载请标明出处.
更多>>相关文档
文档信息
  • 浏览:
  • 页数:23
  • 收藏数:0 收藏
  • 顶次数:0
  • 上传人:6188
  • 时间:2016-05-17
  • 文件大小:0 KB
  • 下载次数:
  • 举报  版权申诉
最近更新
文档标签