二叉树的非递归遍历C++实现
#include<iostream>
#include<stdlib.h>
#define maxsize 100
using namespace std;
typedef struct BTNode{
char val;
BTNode *lchild, *rchild;
}*BiTNode;
void CreateTree(BTNode *&root){
char c;
cin >> c;
if(c == '#')
root = NULL;
else{
root = (BTNode *) malloc(sizeof(BTNode));
if(!root){
cerr << "No More Memory!" << endl;
exit(-1);
}
root->val = c;
CreateTree(root->lchild);
CreateTree(root->rchild);
}
}
void PreOrderRecursion(BTNode *root){
if(root){
cout << root->val << " ";
PreOrderRecursion(root->lchild);
PreOrderRecursion(root->rchild);
}
}
void PreOrderNoRecursion(BTNode *root){
if(!root){
cout << "Root is NULL!" << endl;
return;
}
BTNode* stack[maxsize]; //模拟一个栈
int top = -1; //栈顶指针
stack[++top] = root;
while(top != -1){
BTNode *p = stack[top--];
cout << p->val << " ";
if(p->rchild) //由于左子树先被访问,则右子树应该先入栈
stack[++top] = p->rchild;
if(p->lchild)
stack[++top] = p->lchild;
}
}
void InOrderRecursion(BTNode *root){
if(root){
InOrderRecursion(root->lchild);
cout << root->val << " ";
InOrderRecursion(root->rchild);
}
}
void InOrderNoRecursion(BTNode *root){
if(!root){
cout << "Root is NULL!" << endl;
return;
}
BTNode* stack[maxsize];
int top = -1;
BTNode *p = root;
while(top != -1 || p != NULL){
while(p){
stack[++top] = p;
p = p->lchild;
}
//从根节点一直往左子树遍历,如果没有左子树
//打印这个节点,往右节点移动
p = stack[top--];
cout << p->val << " ";
p = p->rchild;
}
}
void PostOrderRecursion(BTNode *root){
if(root){
PostOrderRecursion(root->lchild);
PostOrderRecursion(root->rchild);
cout << root->val << " ";
}
}
void PostOrderNoRecursion(BTNode *root){
if(!root){
cout << "Root is NULL!" << endl;
return;
}
BTNode* stack1[maxsize]; int top1 = -1;
BTNode* stack2[maxsize]; int top2 = -1;
//首先把根节点如stack1
stack1[++top1] = root;
while(top1 != -1){
BTNode *p = stack1[top1--];
stack2[++top2] = p;
if(p->lchild)
stack1[++top1] = p->lchild;
if(p->rchild)
stack1[++top1] = p->rchild;
}
//此时倒序输出stack2即为后序遍历的序列
while(top2 != -1){
BTNode *p = stack2[top2--];
cout << p->val << " ";
}
}
int main(){
BTNode *root;
CreateTree(root);
/**
test code
*/
return 0;
}
二叉树的非递归遍历C++实现的更多相关文章
- ZT 二叉树的非递归遍历
ZT 二叉树的非递归遍历 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就 是递归定 ...
- K:二叉树的非递归遍历
相关介绍: 二叉树的三种遍历方式(先序遍历,中序遍历,后序遍历)的非递归实现,虽然递归方式的实现较为简单且易于理解,但是由于递归方式的实现受其递归调用栈的深度的限制,当递归调用的深度超过限制的时候, ...
- [Alg] 二叉树的非递归遍历
1. 非递归遍历二叉树算法 (使用stack) 以非递归方式对二叉树进行遍历的算法需要借助一个栈来存放访问过得节点. (1) 前序遍历 从整棵树的根节点开始,对于任意节点V,访问节点V并将节点V入栈, ...
- C++编程练习(17)----“二叉树非递归遍历的实现“
二叉树的非递归遍历 最近看书上说道要掌握二叉树遍历的6种编写方式,之前只用递归方式编写过,这次就用非递归方式编写试一试. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历 ...
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- 非递归遍历二叉树Java实现
2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...
随机推荐
- Java类成员之构造器
构造器含义: 是指使得JVM在构造对象的时候,帮助进行成员变量的初始化的方法. 构造器(构造方法)格式: 1.对于构造方法而言,方法的名称是固定的,和类名相同. 2.对于构造方法而言,它没有返回值,而 ...
- 网络、TCP协议与UDP协议
1.网络模型 (1)什么是网络模型 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外 ...
- Scala 学习(3)之「类——基本概念1」
类 小提示:可以通过:paste进入 Scala 的多行模式,输入对应的代码块之后,按ctrl + D退出多行模式,然后再调用刚才输入的函数或者方法进行测试 //定义类,包含 field 以及方法 c ...
- H5录音音频可视化-实时波形频谱绘制、频率直方图
这段时间给GitHub Recorder开源库添加了两个新的音频可视化功能,比以前单一的动态波形显示丰富了好多(下图后两行是不是比第一行看起来丰满些):趁热打铁写了一个音频可视化相关扩展测试代码,下面 ...
- nginx服务无法停止(Windows)
本人一般停止nginx服务都是通过Windows自带的任务管理器来强制结束nginx进程实现的,如图 2.但是 这次我通过同样的方法来结束nginx服务,发现nginx的进程无法结束 3.首先我要 ...
- 19南京网络赛A 扫描线
题目链接:https://nanti.jisuanke.com/t/41298 扫描线的简单题,题目难在找宫殿的价值(°ー°"),比赛时将近100多行代码找价值,纯模拟,看到题解哭了. 存下 ...
- Java多线程的创建(二)
前言: 虽然java的API中说创建多线程的方式只有两种(There are two ways to create a new thread of execution),分别是继承Thread类创建和 ...
- colab上基于tensorflow2.0的BERT中文多分类
bert模型在tensorflow1.x版本时,也是先发布的命令行版本,随后又发布了bert-tensorflow包,本质上就是把相关bert实现封装起来了. tensorflow2.0刚刚在2019 ...
- MyBatis3——输出参数ResultType、动语态sql
输出参数ResultType 1.输出参数为简单类型(8个基本+String) 2.输出参数为对象类型 3.输出参数为实体对象类型的集合:虽然输出类型为集合,但是resultType依然写集合的元素类 ...
- 夜晚 暴力 十点钟 jQuery 的 extend 实现 原理
jQuery 的 extend 是怎么实现的 一看代码 喉咙 就不爽 这是 jQuery JavaScript Library v1.6 一看代码 多的 屁股疼 , 排名 前三 的 文章 可以去参考下 ...