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实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
随机推荐
- 挖穿各大SRC的短信轰炸
今天给大家分享一个短信轰炸绕过的姿势,大疆.百度.腾讯等等src都有用此方法绕过的案例. 给大家看一下 这里就不给大家截图了,在src中提交的截图都没有打码,这里放出来不太方便. 这里就只举出大疆的例 ...
- Spring常犯的十大错误,你踩过吗?
1.错误一:太过关注底层 我们正在解决这个常见错误,是因为 "非我所创" 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库的 ...
- Python 爬虫监控女神的QQ空间新的说说,实现邮箱发送
主要实现的功能就是:监控女神的 QQ空间,一旦女神发布新的说说,你的邮箱马上就会收到说说内容,是不是想了解一下 先看看代码运行效果图: PS:只有你有一台云服务器你就可以把程序24h运行起来 直接上代 ...
- 接口是什么?接口长什么样?java的Interface
今天来看看java接口长哪样.接口是特殊抽象类. 一个子类只能继承一个抽象类(父类),所以就有接口这个特殊抽象类. 下面以一个电脑的USB为例: 定义接口标准 public interface USB ...
- Spring 梳理 - 视图解析器 VS 视图(View,ViewResolver)
View View接口表示一个响应给用户的视图,例如jsp文件,pdf文件,html文件等 该接口只有两个方法定义,分别表明该视图的ContentType和如何被渲染 Spring中提供了丰富的视图支 ...
- mybatis简单入门介绍
mybatis入门 简介 什么是mybatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及 ...
- 【ADO.NET--MVC】初学MVC(MVC入门)(1)
最近一直在学MVC,本来今天想开始做项目了,但是一下手才发现还有好多好多都不懂,虽然想照搬别人的模板,但是还是觉得很虚,这也不懂哪也不懂.看来学习一门技术断不是那么简单,只要随便套套模板,看看别人代码 ...
- JS实现数组排序的方法
前言 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列,当然排序也是算法中的一种,javascript内置的sort函数是多种排序算法的集合,数组在原数组上进 ...
- CSS技巧 (3)
关于CSS技巧的一些题目 题目列表 所有答案点击题目链接 1.下面这个左边竖条图形,只使用一个标签,可以有多少种实现方式: 2.类似下面这样的条纹边框,只使用一个标签,可以有多少种实现方式 -- 从条 ...
- 02·nginx进阶·服务优化配置管理
企业场景常用的Nginx http功能模块汇总 ngx_ http_ core_ module 包括-些核心的http 参数配置,对应Nginx的配置为HTTP区块部分 ngx_ http _acce ...