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实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
随机推荐
- JAVASE知识点总结(二)
第十三章:多态 一.instanceof 判断一个类是否是指定的类 真则返回true 假则返回false. 二.字段没有多态,只有方法有多态,字段前面是的什么类型,字段就调用谁的,在编译时就已经确 ...
- Mysql 笔记(一)
InnoDB存储引擎 mysql 存储引擎(好难用,看https://www.zybuluo.com/eqyun/note/27850) 简介 InnoDB是事务安全的MySQL存储引擎,从MySQL ...
- Hbase入门(二)——安装与配置
本文讲述如何安装,部署,启停HBase集群,如何通过命令行对Hbase进行基本操作. 并介绍Hbase的配置文件. 在安装前需要将所有先决条件安装完成. 一.先决条件 1.JDK 和Hadoop一样, ...
- 在Docker中启动Cloudera
写在前面 记录一下,一个简单的cloudera处理平台的构建过程和一些基本组件的使用 前置说明 需要一台安装有Docker的机器 docker常用命令: docker ps docker ps -a ...
- win10下安装npm&cnpm步骤
1.node官网下载安装包 2.分别输入node -v,npm -v检查是否完成 3.配置npm的全局模块的存放路径以及cache的路径,新建node_global和node_cache文件,以下是我 ...
- 23种设计模式之单例(Singleton Pattern)
单例 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例(eg:应对一些特殊情况,比如数据库连接池(内置了资源) 全局唯一号码生成器),才能确保它们的逻辑正确性.以及良好的效率 ...
- Spring boot 梳理 - SpringApplication
简单启动方式 public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, a ...
- Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value:
问题:ERROR JDBCExceptionReporter:72 - Data truncation: Incorrect datetime value: '' for column 'create ...
- layui select获取自定义属性值
layui-select写法: <option value='> 我想在点击的时候获取自定义属性data-method的值,其中selectId是该select的id form.on('s ...
- win10 cnpm安装完之后一直说不是内部命令的原因
找到cnpm的默认安装路径 一般默认的是 D:\Program Files\nodejs\node_modules 然后添加环境变量中 win10是在系统环境变量中切记不是在用户变量中.保存之后,重新 ...