//这不是最有效的方法,但使用了标记为容易理解,记下

/*
*   description:树的遍历示例,非递归版本
*               入栈顺序:
*               前序: 右子树   - 左子树   - 当前节点
*               中序: 右子树   - 当前节点 - 左子树
*               后序: 当前节点 - 右子树   - 左子树
*
*   writeby:    nick
*   date:       2012-10-22 23:56
*/
#include <iostream>
#include <stack>using namespace std;struct node
{int item;bool flag;node *l, *r;node(int n){item=n; l=0; r=0; flag=false;}
};
typedef node *link;//前序遍历
void pretraverse(link h, void visit(link))
{stack<link> s;s.push(h);while(!s.empty()){h = s.top();s.pop();visit( h );if (h->r != 0) s.push(h->r);if (h->l != 0) s.push(h->l);}
}//中序遍历
void midtraverse(link h, void visit(link))
{stack<link> s;s.push(h);while(!s.empty()){h = s.top();s.pop();if(h->flag == true) {visit(h); continue;}if(h->r != 0 && h->r->flag == false) s.push(h->r);if(h->flag==false){ h->flag=true; s.push(h);}if(h->l != 0 && h->l->flag == false) s.push(h->l);}}//后序遍历
void posttraverse(link h, void visit(link))
{stack<link> s;s.push(h);while(!s.empty()){h = s.top();s.pop();if(h->flag == true) {visit(h); continue;}if(h->flag==false){ h->flag=true; s.push(h);}if(h->r != 0 && h->r->flag == false) s.push(h->r);if(h->l != 0 && h->l->flag == false) s.push(h->l);}
}void visit(link p)
{cout << p->item << " ";
}int main()
{link root = new node(4);root->l = new node(5);root->r = new node(6);root->l->l = new node(7);root->l->r = new node(8);cout << "先序遍历:";pretraverse(root, visit);cout << endl << "中序遍历:";midtraverse(root, visit);root->flag          = false;root->l->flag       = false;root->r->flag       = false;root->l->l->flag    = false;root->l->r->flag    = false;cout << endl << "后序遍历:";posttraverse(root, visit);return 0;
}

转载于:https://www.cnblogs.com/wouldguan/archive/2012/10/23/2735511.html

C++遍历树-非递归递归-使用了标记位相关推荐

  1. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...

    树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...

  2. 漫谈二叉树遍历(非递归)

    ------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...

  3. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  4. 二叉树先中后序递归遍历与非递归遍历、层次遍历

    文章目录 1 先序遍历 1.1 先序遍历递归 1.2 先序遍历非递归 2 中序遍历 2.1 中序遍历递归 2.2 中序遍历非递归 3 后序遍历 3.1 后序遍历递归 3.2 后序遍历非递归 4 层序遍 ...

  5. c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)

    五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...

  6. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

  7. 二叉树的遍历(非递归)整理

    二叉树的遍历(非递归) 写在前面 二叉树重要,重要,重要.以下代码每日手撸一遍,深刻理解. 二叉树的先序遍历(非递归) 巧记心法 判断是否为空树 1.右侧入栈(访问,q指向右孩子,不空则入栈) 2.p ...

  8. 树的深度 递归非递归实现

    树的深度 递归非递归实现 package com.dugstudio.SwordToOffer;import java.util.LinkedList;/*** 树的深度递归和非递归算法*/ clas ...

  9. 中序遍历二叉树-非递归方式实现-附C++代码

    一.问题描述 给定一个二叉树,要求以非递归的方式进行中序遍历. 原题:二叉树的中序遍历 - leetcode 二.解题思路 首先需要知道一些前置知识:中序遍历是指按 左子树 -> 根节点 -&g ...

最新文章

  1. AI一分钟 | 传阿里暂停在美扩张云业务;Google发布AI工具以识别儿童性侵犯图片...
  2. JRoll 2 使用文档(史上最强大的下拉刷新,滚动,无限加载插件)
  3. php捕获Fatal error错误与异常处理
  4. Styled Label
  5. 项目管理理论与实践(1)——企业项目管理介绍
  6. shell--变量的替换
  7. 科技公司最爱的 50 款开源工具,你都用过吗?
  8. C++11 —— 简易的旋转锁类
  9. 自学python在家怎么上班_【经验分享】转行如何自学Python并且找到工作,分享自己心得...
  10. Origin2017绘制3D饼状图 去掉指定图例
  11. 矩阵经典题目六:poj 3070 Fibonacci
  12. JavaScript 常用单词整理
  13. centos7 hostnamectl
  14. Fast DDS Fast DDS主要包括以下内容DDS API、Fast DDS-Gen、RTPS Wire Protocol
  15. 曙光超级计算机用的芯片是国产吗,真正中国芯片龙头是中科曙光
  16. R语言排序三个基本函数:sort(),rank(),order()的用法
  17. 仿购物网站-HTML手写代码(仅提供参考)
  18. 超文本传输协议 - 白话篇
  19. AEG 2A 400-280 HFRL1
  20. 20款华丽的几何形状字体【免费下载】

热门文章

  1. 电脑卡顿,最先升级这个硬件,运行速度可快速提升!
  2. 给大家推荐一款高逼格的Linux磁盘信息查看工具
  3. 硬件:选购CPU和显卡需了解的参数,TDP、SDP、ACP、GCP、TBP是什么?
  4. C# 如何转换生成长整型的时间
  5. exec族函数、system函数、popen函数、PATH
  6. 深度学习 Caffe 初始化流程理解(数据流建立)
  7. URLScan工具配置方法第1/2页
  8. 写出整洁的高效的js代码
  9. SpringMVC 数据的格式化、JSR 303数据校验和国际化
  10. 一个redis的连接库的实现