C语言 二叉树的遍历(递归和非递归)
#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语言 二叉树的遍历(递归和非递归)的更多相关文章
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- C实现二叉树(模块化集成,遍历的递归与非递归实现)
C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- 二叉树前中后/层次遍历的递归与非递归形式(c++)
/* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...
- Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- Java - 二叉树递归与非递归
树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...
- 二叉树之AVL树的平衡实现(递归与非递归)
这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...
- 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...
- 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
随机推荐
- Java 基础篇之类与对象
类与对象 类.对象和引用的关系 类和对象的关系 类是对象的模版,对象是类的一个实例,一个类可以有很多对象 一个Java程序中类名相同的类只能有一个,也就是类型不会重名 一个对象只能根据一个类来创建 引 ...
- Java 8 时间日期使用
一.日期时间 Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理.java.util.Date和SimpleDateFormatter都不是线程安全的 ...
- 虚拟现实中的Motion Sickness晕动症问题 - VIMS
虚拟现实(VR)中的晕动症 - VIMS 在玩VR的时候,很多玩家都遇到过发晕恶心等症状,这就是晕动症(Motion Sickness,以下或简称MS).MS并不是VR特有的问题.我们在坐船.坐车.坐 ...
- 织梦DEDE分类信息实现联动筛选(支持多条件多级选项)解决方案
发布时间:2017-03-25 来源:未知 浏览:404 关键词: 很多织梦建站的站长在做产品列表页的时候,产品分类多而且都是关联的,用户不能快速的找到自己需要的东西,很多情况下都需要用到筛选功能,织 ...
- 【柠檬班】jmeter 不写代码,秒秒钟提取动态列表最后一个值
在用jmeter做接口测试时,我们经常会遇到,一个接口返回一个json串,在这个json串中,某个节点的值是一个列表,而且这个列表的长度是动态变化的.如: 获取用户列表,用户信息是个列表,类似的接 ...
- Java 学习笔记之 线程sleep方法
线程sleep方法: 单主线程使用sleep: Main线程差了2000毫秒. public class MainSleepThread extends Thread{ @Override publi ...
- 快学Scala 第二十一课 (初始化trait的抽象字段)
初始化trait的抽象字段: trait Logged { println("Logged constructor") def log(msg: String){ println( ...
- reduce方法应用技巧
定义和用法 reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. 注意: reduce() 对于空数组是不会执行回调函数的. 浏览器支持 方法 Chro ...
- 求n以内的质数(质数的定义:在大于1的自然数中,除了1和它本身意外,无法被其他自然数整除的数)
思路: 1.(质数筛选定理)n不能够被不大于根号n的任何质数整除,则n是一个质数2.除了2的偶数都不是质数代码如下: /** * 求n内的质数 * @param int $n * @return ar ...
- JSON parse error: No suitable constructor found for type
错误信息: 2019-02-19 09:17:58,678 [http-nio-8080-exec-1] WARN org.springframework.web.servlet.mvc.suppor ...