实验题目:
    实现二叉树各种遍历算法
实验目的:
     领会二叉树的各种遍历过程以及遍历算法设计
实验内容:
      设计程序,实现二叉树的先序遍历、中序遍历和后序遍历的
      递归和非递归算法,以及层次遍历的算法。

整个实现步骤:

  1. 二叉树各种运算的定义
  2. 以二叉树结点为元素的栈的定义(由于非递归的遍历算法需要)
  3. 以二叉树结点为元素的循环队列的定义(由于层次遍历需要)

代码如下

exp7-2.cpp:

//
// Created by liushihao on 19-4-26.
//
#include "iostream"
using namespace std;/*********************二叉树的定义和各种运算部分**********************/
#define Maxsize 100
typedef char ElemType;
typedef struct node
{ElemType data;struct node *lchild;struct node *rchild;
}BTNode;void CreateBTree(BTNode * &b, char *str) //创造二叉树
{BTNode *St[Maxsize], *p;int top=-1,k,j=0;char ch;b=NULL;ch=str[j];while(ch!='\0'){switch (ch){case '(':top++;St[top]=p;k=1;break;case ')':top--;              break;case ',':k=2;                break;default:p=(BTNode*)malloc(sizeof(BTNode));p->data=ch;p->lchild=p->rchild=NULL;if(b==NULL)b=p;else{switch(k){case 1:St[top]->lchild=p;break;case 2:St[top]->rchild=p;break;}}}j++;ch=str[j];}
}void DestroyBtree(BTNode *&b)  //销毁二叉树
{if(b!=NULL){DestroyBtree(b->lchild);DestroyBtree(b->rchild);free(b);}
}BTNode *FindNode(BTNode *b,ElemType x)
{BTNode *p;if(b==NULL){return NULL;}else if(b->data==x){return b;}else{p=FindNode(b->lchild, x);if(p!=NULL){return p;}else{return FindNode(b->rchild, x);}}
}BTNode *LchildNode(BTNode *p)  //返回左子树
{return p->lchild;
}BTNode *RchildNode(BTNode *p)  //返回右子树
{return p->rchild;
}int BTHeight(BTNode *b)       //求二叉树的高度
{int lchildh,rchildh;if(b==NULL) return 0;else{lchildh=BTHeight(b->lchild);rchildh=BTHeight(b->rchild);return (lchildh>rchildh)? (lchildh+1):(rchildh+1);}
}void DispBTree(BTNode *b)      //输出二叉树
{if(b!=NULL){cout<<b->data;if(b->lchild!=NULL || b->rchild!=NULL){cout<<"(";DispBTree(b->lchild);if(b->rchild!= NULL) cout<<",";DispBTree(b->rchild);cout<<")";}}
}
/*****************队列定义和各种算法部分********************/
#define MaxSize2 50typedef struct {BTNode *data[MaxSize2];int front, rear;
}SqQueue;
void InitQueue(SqQueue *&q)
{q=(SqQueue *)malloc(sizeof(SqQueue));q->front=q->rear=0;
}void DestroyQueue(SqQueue *&q)
{free(q);
}bool QueueEmpty(SqQueue *q)
{return (q->front==q->rear);
}bool enQueue(SqQueue *&q,BTNode *e)
{if((q->rear+1)%MaxSize2==q->front){return false;}q->rear=(q->rear+1)%MaxSize2;q->data[q->rear]=e;return true;
}bool deQueue(SqQueue *&q,BTNode *&e)
{if(q->front==q->rear){return false;}q->front=(q->front+1)%MaxSize2;e=q->data[q->front];return true;
}/**********************栈定义部分**********************/
/****************************************************/
#define Maxsize3 50
typedef struct
{BTNode *data[Maxsize3];int top;
}SqStack;void InitStack(SqStack *&s)
{s=(SqStack*)malloc(sizeof(SqStack));s->top=-1;
}void DestroyStack(SqStack *&s)
{free(s);
}bool StackEmpty(SqStack *s)
{return (s->top==-1);
}bool Push(SqStack *&s,BTNode *e)
{if(s->top==Maxsize3-1){return false;}s->top++;s->data[s->top]=e;return true;
}bool Pop(SqStack *&s,BTNode* &e)
{if(s->top==-1)return false;e=s->data[s->top];s->top--;return true;
}bool GetTop(SqStack *s,BTNode* &e)
{if(s->top==-1)return false;e=s->data[s->top];return true;
}/*********************遍历算法部分*********************/
void PreOrder_recursion(BTNode *b)   //递归先序遍历
{if(b!=NULL){cout<<b->data;PreOrder_recursion(b->lchild);PreOrder_recursion(b->rchild);}
}void PreOrder_not_recursion(BTNode *b) //非递归先序遍历
{BTNode *p;SqStack *st;InitStack(st);if(b!=NULL){Push(st,b);while(!StackEmpty(st)){Pop(st,p);cout<<p->data;if(p->rchild!=NULL){Push(st,p->rchild);}if(p->lchild!=NULL){Push(st,p->lchild);}}cout<<endl;}DestroyStack(st);
}void InOrder_recursion(BTNode *b)   //递归中序遍历
{if(b!=NULL){InOrder_recursion(b->lchild);cout<<b->data;InOrder_recursion(b->rchild);}
}void InOrder_not_recursion(BTNode *b) //非递归中序遍历
{BTNode *p;SqStack *st;InitStack(st);p=b;while(!StackEmpty(st) || p!=NULL){while(p!=NULL){Push(st,p);p=p->lchild;}if(!StackEmpty(st)){Pop(st,p);cout<<p->data;p=p->rchild;}}cout<<endl;DestroyStack(st);
}void PostOrder_recursion(BTNode *b)   //递归后序遍历
{if(b!=NULL){PostOrder_recursion(b->lchild);PostOrder_recursion(b->rchild);cout<<b->data;}
}void PostOrder_not_recursion(BTNode *b) //非递归后序遍历
{BTNode *p,*r;bool flag;SqStack *st;InitStack(st);p=b;do{while(p!=NULL){Push(st,p);p=p->lchild;}r=NULL;flag=true;while(!StackEmpty(st)&&flag){GetTop(st,p);if(p->rchild==r){cout<<p->data;Pop(st,p);r=p;}else{p=p->rchild;flag=false;}}}while (!StackEmpty(st));cout<<endl;DestroyStack(st);
}void LevelOrder(BTNode *b)
{BTNode *p;SqQueue *qu;InitQueue(qu);if(b!= nullptr){enQueue(qu,b);while(!QueueEmpty(qu)){deQueue(qu,p);cout<<p->data;if(p->lchild!=NULL)enQueue(qu,p->lchild);if(p->rchild!=NULL)enQueue(qu,p->rchild);}}}int main()
{BTNode *b;char str[]="A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))";CreateBTree(b, str);cout<<"初始化二叉树为:"<<endl;DispBTree(b);cout<<endl;cout<<"递归先序遍历";PreOrder_recursion(b);cout<<endl;cout<<"非递归先序遍历";PreOrder_not_recursion(b);cout<<"递归中序遍历";InOrder_recursion(b);cout<<endl;cout<<"非递归中序遍历";InOrder_not_recursion(b);cout<<"递归先序遍历";PostOrder_recursion(b);cout<<endl;cout<<"非递归先序遍历";PostOrder_not_recursion(b);cout<<"层次遍历:";LevelOrder(b);return 0;
}

数据结构 第七章 实验题2 实现二叉树的各种遍历算法相关推荐

  1. 数据结构第七章实验题3-由遍历序列构造二叉树

    实验题3-由遍历序列构造二叉树 目的:领会二叉树的构造过程以及构浩二叉树的算法设计 内容:内容:编写一个程序exp7-3.cpp,实现由先序序列和中序序列以及由中序序列和后序序列构造一棵二叉树的功能( ...

  2. 数据结构题及c语言版严第七章答案,数据结构第七章习题答案.doc

    数据结构第七章习题答案 PAGE PAGE 9 第7章 <图>习题参考答案 一.单选题(每题1分,共16分) ( C )1. 在一个图中,所有顶点的度数之和等于图的边数的 倍. A.1/2 ...

  3. 厦门大学c语言第七八章作业答案,数据结构第七章考试题库(含答案).doc

    数据结构第七章考试题库(含答案).doc 第七章 图一.选择题1图中有关路径的定义是( ).[北方交通大学 2001 一.24 (2分)]A由顶点和相邻顶点序偶构成的边所形成的序列 B由不同顶点所形成 ...

  4. 第七章 实验传统的兴起

    第七章 实验传统的兴起 近代科学的三大传统 数理传统(希腊理性传统的再现) 孤立化.原子化.碎片化分析 实验传统 博物学传统 科学革命导致的两大主题 世界图景的机械化 自然的数学化与分析化 实验传统的 ...

  5. C++ Primer Plus 第七章编程题练习

    C++ Primer Plus 第七章编程题练习 第一题 题目描述 编写一个程序,不断要求用户输入两个数,直到其中的一个为0.对于每两个数,程序将使用一个 函数来计算它们的调和平均数,并将结果返回给m ...

  6. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  7. 小孩的游戏 - 2021数据结构 排序和选择实验题

    小孩的游戏 - 2021数据结构 排序和选择实验题 pre 做都做了, 干脆发上来算了 : D 题目分析 算法与数据结构实验题 5.18 小孩的游戏 ★实验任务 一群小孩子在玩游戏,游戏规则是这样子, ...

  8. 牛客题霸 [ 求二叉树的层序遍历] C++题解/答案

    牛客题霸 [ 求二叉树的层序遍历] C++题解/答案 题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该 ...

  9. 数据结构题及c语言版答案第七章,数据结构第七章习题答案

    第七章 图 1.下面是一个图的邻接表结构,画出此图,并根据此存储结构和深度优先搜索算法写出从C开始的深度优先搜索序列. 0 A 1 3 ^ 1 B 3 5 ^ 2 C 3 0 ^ 3 D 4 ^ 4 ...

最新文章

  1. 样式集(五)微信朋友圈样式模拟
  2. 矩阵相乘原理与C实现(实矩阵)
  3. ansible企业级自动化运维工具
  4. Matlab-运算符
  5. 说说 “后台开发” 需要注意哪几点
  6. 如何理解python_如何理解 Python
  7. 考研计算机专业课统考吗,【计算机考研】你了解计算机统考408吗?
  8. java enum in class_Java 8需要一个转换,而Java 7没有 – enum.getClass/getDeclaringClass
  9. 【OpenCV 例程200篇】37. 图像的灰度化处理和二值化处理
  10. 力扣349. 两个数组的交集(JavaScript)
  11. 【UVA-10891】Game of Sum【区间DP】
  12. 3580整数配对---20210527
  13. CRT和LCD显示器的区别
  14. 盛迈坤电商:店铺获得流量有哪些方法
  15. 05-----关于C++使用VS时出现 error C2248: “xxx“ 无法访问private成员(在“MySpdlog“类中声明)
  16. 修建道路(最小生成树)
  17. rancher坏了或删除,继续使用k8s集群
  18. iOS9 中关闭ATS的方法
  19. 相似数据检测算法(shingle,SimHash,Bloomfilter) 比较
  20. Python Pillow (PIL) Image.save 保存为jpg图片压缩问题

热门文章

  1. @antv/l7绘制地图,添加图例,修改地图上颜色,是否允许地图拖拽,是否滚动缩放等
  2. 基于ibeacon的博物馆智能导览系统解决方案
  3. 【c++内存系列】二、c++动态内存分配和静态内存分配
  4. 三菱FX5U系列PLC与威纶触摸屏以太网通信具体步骤
  5. item_password-获得淘口令真实url API调用说明
  6. 一大波年终工作总结PPT来袭赶紧收藏!
  7. 最大限度地提升你的笔记本显卡性能
  8. 商务通核心函数库代码(2)
  9. SNS平台ConcourseConnect
  10. 跟随鼠标的弹性小球代码