#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. mysql备份脚本并保留7天

    脚本需求: 每天备份mysql数据库,保留7天的脚本. 存放在/opt/dbbak目录中. 脚本名称为database_xxxx-xx-xx.sql 脚本内容: #!/bin/bash export ...

  2. Sentinel Core流程分析

     上次介绍了Sentinel的基本概念,并在文章的最后介绍了基本的用法.这次将对用法中的主要流程和实现做说明,该部分主要涉及到源码中的sentinel-core模块. 1.token获取   如上为t ...

  3. Spring boot 梳理 - 全局配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到resources下。

    全局配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到resources下.

  4. javaweb中文中乱码分析与解决

    要想解决乱码的问题, 最好的办法是先弄清楚javaweb中数据传送的原理. 本文件将简单的讲解客户端的请求和服务器响应中编码的转换过程, 以及如何解决乱码的 问题. request(req):  se ...

  5. Ubuntu使用vi命令时,不能正常编辑文件,使用方向键时老是出现很多字母解决方案

    原因是系统只装了vi,没有装vim.因为vi是不能直接按退格键删除字符的.所以重新装下vim指令即可: # sudo apt-get install vim 重新使用vi命令进行文件编辑.

  6. SpringBoot 定时任务实现方式

    定时任务实现的几种方式: Timer:是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但 ...

  7. bugku—Web_Writeup

    Bugku_Web_Writeup Writeup略显粗糙~~ 部分Web题没有得到最后的flag~只是有了一个简单的思路~~ Web1: 如上,打开题目答题网址后就会弹出一张图片,看图片就可以发现是 ...

  8. HDU 1159——Common Subsequence(DP)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 题解 #include<iostream> #include<cstring> ...

  9. js中对于数组的操作

    let myArray=[11,22,33]; console.log('原数组:',myArray); myArray.push(44,55); console.log('用push在数组后面插入元 ...

  10. Transactional事务提交后触发异步方法

    一.问题复现 1.场景 2个service方法, 方法A中调用方法B. 方法A 是核心业务方法,涉及多张表数据变更,为了保持数据一致,用spring事务注解:@Transactional(rollba ...