二叉树的非递归遍历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 ...
随机推荐
- MapInfo常见数据格式
在MapInfo 中所指的表是单纯的数据表或是图形与数据的结合.一个典型的MapInfo表将主要由*.tab.*.dat.*.wks.*.dbf.*.xls.*.map.*.id.*.ind文件格式组 ...
- 使用iview遇到问题记录总结
1.iview设置日期不可用,设置开始开始时间早于结束时间 官网示例,设置今天之前不可选,但是不能识别thisdisabledDate (date) { return date && ...
- CS0656 缺少编译器要求的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”
问题出现原因:在net core使用动态类型dynamic,在编译的时候提示错误信息如上. 解决方案: 1.不用dynamic类型 2.在使用的地方添加一个dll,Microsoft.CSharp,或 ...
- 6、使用基元类型而不要使用 FCL 类型
基元类型: int string object uint long ulong 等 ; FCL (Framework Class Library ) System.Int32 等. 一些定义在一些语言 ...
- 【5min+】闪电光速拳? .NetCore 中的Span
系列介绍 简介 [五分钟的DotNet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的. ...
- .NET为什么要使用异步(async)编程?⭐⭐⭐⭐⭐
.NET为什么要使用异步(async)编程? 有几点坐下笔记 ⭐⭐⭐⭐: 1. 同步方法 static void Main(string[] args) { Console.WriteLine($&q ...
- struts2学习第一天
Stuts2是基于MVC设计模式成熟的Web应用框架.不仅仅是Struts1的下一个版本,是一个全新的Struts架构.由WebWork社区跟Strut社区联手打造的.(教程来自W3Cschool) ...
- vue计算属性例子
不使用计算属性 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- mysql的压缩版安装
MYSQL压缩版 自己建立: data(位于mysql的bin一层文件夹),my.ini(文本) my.ini(下面是文本内容) [client] port=3306 default-characte ...
- java面试|精选基础(1)
以下题目是从面试经历和常考面试题中选出有点儿意思的题目,参考答案如有错误,请联系小编指正,感谢! 1.反射 1.1定义 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法 ...