#include <iostream>
#include <cstdio>
#include "biTree.h"
#include "cstdlib"
#define OVERFLOW -1
#include <stack>
using namespace std; Status CreateBiTree( BiTree &T ) {
int a;
printf( "Creating BiTree .....\n" );
printf( "input: <number>:" );
scanf( "%d",&a );
if ( a==0 ) {
T=NULL;
}
else {
T=( BiTree )malloc( sizeof( BiTNode ) );
if ( !T )
exit( OVERFLOW );
T->data=a;
CreateBiTree( T->lchild );
CreateBiTree( T->rchild );
}
return OK;
} Status PreOrderTraverse( BiTree T,Status( * Visit )( TElemtype e ) ) {
if ( T ) {
Visit( T->data );
PreOrderTraverse( T->lchild,Visit );
PreOrderTraverse( T->rchild,Visit );
}
return OK;
} Status InOrderTraverse( BiTree T,Status( *Visit )( TElemtype e ) ) {
if ( T ) {
InOrderTraverse( T->lchild,Visit );
Visit( T->data );
InOrderTraverse( T->rchild,Visit );
}
return OK;
} Status PostOrderTraverse( BiTree T,Status( *Visit )( TElemtype e ) ) {
if ( T ) {
PostOrderTraverse( T->lchild,Visit );
PostOrderTraverse( T->rchild,Visit );
Visit( T->data );
}
return OK;
} Status InOrderTraverseNoDG( BiTree T,Status( *Visit )( TElemtype e ) ) {
stack<BiTree> st;
BiTree p=NULL;
st.push( T );
while ( !st.empty() ) {
while ( ( p=st.top() )&&p ) {
st.push( p->lchild );
}
st.pop();//走到头然后继续往右
if ( !st.empty() ) {
p=st.top();
st.pop();
if ( !Visit( p->data ) )
return ERROR;
st.push( p->rchild ); //输出根之后 在栈顶(当前节点)继续往左循环
}
}
return OK;
} Status PreOrderTraverseNoDG( BiTree T,Status( *Visit )( TElemtype e ) ) {
stack<BiTree> st;
BiTree p=NULL;
st.push( T );
while ( !st.empty() ) {
while ( ( p=st.top() )&&p ) {
if ( !Visit( p->data ) )
return ERROR;
st.push( p->lchild );
}
st.pop();//走到头然后继续往右
if ( !st.empty() ) {
p=st.top();
st.pop();
st.push( p->rchild ); //输出根之后 在栈顶(当前节点)继续往左循环
}
}
return OK;
} Status PostOrderTraverseNoDG( BiTree T,Status( *Visit )( TElemtype e ) ) {
/*
如果不使用标志位区分第几次到达根结点,
可以利用如下的后序遍历特征来完成:当栈顶元素(根)的右子树为空(即:无右孩子),
或者是右子树非空但是已遍历完,即右孩子恰好是刚才访问过的结点,
此时应访问栈顶结点,并在访问后退栈
否则,如果栈顶元素的右孩子非空且未遍历,
此时直接访问栈顶元素的右孩子而不退栈,
算法要点只是需要记住最近访问过的结点即可
*/
BiTree p=T;
stack <BiTree> st;
BiTree have_visited=NULL;
while ( NULL!=p||!st.empty() ) {
while ( NULL!=p ) {
st.push( p );
p=p->lchild;
}
p=st.top();
if ( NULL==p->rchild||have_visited==p->rchild ) {
Visit( p->data );
st.pop();
have_visited=p;
p=NULL;
}
else {
p=p->rchild;
}
}
return OK;
} int main() {
BiTree newBiT;
CreateBiTree( newBiT );
printf( "先序遍历结果\n" );
PreOrderTraverse( newBiT,Visit );
printf( "\n中序遍历结果\n" );
InOrderTraverse( newBiT,Visit );
printf( "\n后序遍历结果\n" );
PostOrderTraverse( newBiT,Visit );
printf( "\n---非递归中根---\n" );
InOrderTraverseNoDG( newBiT,Visit );
printf( "\n---非递归先根---\n" );
PreOrderTraverseNoDG( newBiT,Visit );
printf( "\n---非递归后根---\n" );
PostOrderTraverseNoDG( newBiT,Visit );
return 0;
}

C语言 二叉树的遍历(递归和非递归)的更多相关文章

  1. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  2. C实现二叉树(模块化集成,遍历的递归与非递归实现)

    C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...

  3. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  4. JAVA递归、非递归遍历二叉树(转)

    原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...

  5. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  6. Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  7. Java - 二叉树递归与非递归

    树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...

  8. 二叉树之AVL树的平衡实现(递归与非递归)

    这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...

  9. 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)

    邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...

  10. 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

随机推荐

  1. ASP.NET Core 3.0 : 二十四. 配置的Options模式

    上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式.(ASP.NET Core 系列目录) 一.Options的使用 上一章有个配置的绑定的例子,可 ...

  2. 10.Django基础八之cookie和session

    一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器 ...

  3. css或Angular框架限制文本字数

    提需求的来了 某一期产品迭代时,新增了一个小功能,即:在单元格中的文本内容,字符超过20个字的时候,需要截断,并显示20个字符+一个省略号,未超过,无视. 这需求看上去不怎么复杂,看起来可以用css做 ...

  4. mybatis执行过程及经典面试题

    Mybatis执行流程 mybatis中xml解析是通过SqlSessionFactoryBuilder.build()方法. 初始化mybatis(解析xml文件构建成Configuration对象 ...

  5. 实现一个图片轮播-3d播放效果

    前言:最近在做一个音乐播放器,首页要做一个图片轮播,看了bootstrap的carousel插件以及移动端的swipe.js库,都是平面图片轮播的效果,所以自己想着实现类似网易云app里那种3d图片轮 ...

  6. C#调用OpenCV开发简易版美图工具

    前言 在C#调用OpenCV其实非常简单,因为C#中有很多OPenCV的开源类库. 本文主要介绍在WPF项目中使用OpenCVSharp3-AnyCPU开源类库处理图片,下面我们先来做开发前的准备工作 ...

  7. IDEA 学习笔记之 Scala项目开发

    Scala项目开发: 由于直接下载Scala plugin太慢,老是中断,所以手动下载: https://plugins.jetbrains.com/ 手动安装Scala plugin: 新建Scal ...

  8. Flutter学习笔记(29)--Flutter如何与native进行通信

    如需转载,请注明出处:Flutter学习笔记(29)--Flutter如何与native进行通信 前言:在我们开发Flutter项目的时候,难免会遇到需要调用native api或者是其他的情况,这时 ...

  9. Timed out after 30000 ms while waiting to connect

    今天使用mongo-java-drive写连接mongo的客户端,着实被上面那个错坑了一把.回顾一下解决过程: 报错: com.mongodb.MongoTimeoutException: Timed ...

  10. TensorFlow2.0(六):Dataset

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...