二叉树的非递归遍历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 ...
随机推荐
- Redis 分布式锁的正确实现方式( Java 版 )
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- Mybatis中jdbcType的类型
具体支持的类型参见:org.apache.ibatis.type.JdbcType ARRAY, BIT, TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT, REA ...
- python shutil 文件(夹)的复制、删除、移动、压缩和解压
高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 import shutil shutil.copy ...
- Flash 上下文管理
1.Local() 作用:为每个协程或线程创建一个独立的内存空间 储存格式: { 唯一标识: {'stack': []} } 代码 try: from greenlet import getcurre ...
- Qt Installer Framework翻译(3-1)
初始化安装 下图说明了安装应用程序的默认工作流程: 本节使用在macOS上运行的Your Application Installer示例来说明默认工作流程.安装程序具有本地化外观,并可感知每个受支持的 ...
- 小白学Java:I/O流
目录 小白学Java:I/O流 基本分类 发展史 文件字符流 输出的基本结构 流中的异常处理 异常处理新方式 读取的基本结构 运用输入与输出 文件字节流 缓冲流 字符缓冲流 装饰设计模式 转换流(适配 ...
- reactNative-解决react native使用fetch函数 Network request failed 问题
解决react native使用fetch函数Network request failed问题 最近公司新开发一个app, 用react native架构好后,用xcode模拟器打开app,对接登陆接 ...
- ios启动流程
1.创建UIApplication (1.打开网页,发短信,打电话 . 2.设置应用程序提醒数字 . 3.设置联网状态 . 4.设置状态栏) 2.创建AppDelegate代理对象,并且成为UIApp ...
- django用户认证的session的应用
from django.shortcuts import render,redirect def login(request): if request.method=='GET': return re ...
- SpringBoot+vue+Iview前后端分离权限内容管理CMS系统
hrcms基于springBoot框架的内容管理系统,采用最新最主流的技术,后端采用spring boot,mybatis-plus,freemaker,shiro,redis,mysql,等,主要功 ...