二叉树递归和非递归遍历


源码:

#include<queue>
#include<stack>
#include<vector>
#include<iostream>
using namespace std;
//假设空节点的值为-1
//const int arrrlens = 18;
//char arr[arrrlens] = { 'A', 'B', 'D' , '#', 'H', '#', '#', 'E', '#', '#',\'C', 'F' , '#', '#', 'G', '#', '#'};
//A B D # H # # E # # C F # # G # #
class Node {
public:Node(int el = 0, Node * l = NULL, Node * r = NULL) {data = el;mark = 0;left = l;right = r;}char data;int mark;Node* left, * right;
};
class Tree {
public:Tree() { root = NULL; }~Tree() { delete root; }int create(Node* &);int preOrder();int infxOrder();int postOrder();int print_preOrder(Node*);int print_infixOrder(Node*);int print_postOrder(Node*);
public:Node* root;
};
int Tree::print_preOrder(Node* root)
{//递归先序遍历if (root != NULL){cout << root->data << " ";print_preOrder(root->left);print_preOrder(root->right);}return 0;
}
int Tree::print_infixOrder(Node* root)
{//递归中序遍历if (root != NULL){print_infixOrder(root->left);cout << root->data << " ";print_infixOrder(root->right);}return 0;
}
int Tree::print_postOrder(Node* root)
{//递归后序遍历if (root != NULL){print_postOrder(root->left);print_postOrder(root->right);cout << root->data << " ";}return 0;
}
int Tree::preOrder()
{/*先序遍历,采用非递归的方法*/cout << endl << "先序遍历,采用非递归的方法" << endl;Node* p = root;stack<Node*> S;while (p != NULL || !S.empty()){if (p != NULL){ cout << p->data << " ";S.push(p);p = p->left;}else{p = S.top();S.pop();p = p->right;}}return 0;
}
int Tree::infxOrder()
{/*中序遍历,采用非递归的方法*/cout << endl << "中序遍历,采用非递归的方法" << endl;Node* p = root;stack<Node*> S;while (p != NULL || !S.empty()){if (p != NULL){ S.push(p);p = p->left;}else {p = S.top();S.pop();cout << p->data << " ";p = p->right;}}return 0;
}
int Tree::postOrder()
{/*后序遍历,采用非递归的方法*/cout << endl << "后序遍历,采用非递归的方法" << endl;Node* p = root;vector<Node*> S;vector<char> res;while (p != NULL || !S.empty()){if (p != NULL){S.push_back(p);res.push_back(p->data);p = p->right;}else{p = S.back();S.pop_back();p = p->left;}}reverse(res.begin(), res.end());vector<char>::iterator ite = res.begin();for (; ite != res.end(); ite++) {cout << *ite <<" ";}cout << endl;return 0;
}
int Tree::create(Node*& root)
{// input: A B D # H # # E # # C F # # G # #char val;cin >> val;if (val != '#'){root = new Node(val);create(root->left);create(root->right);}elseroot = NULL;return 0;
}
int main()
{Tree tree;//intpu: A B D # H # # E # # C F # # G # #tree.create(tree.root);cout << " 递归先序遍历" << endl;tree.print_preOrder(tree.root);cout << endl << " 递归中序遍历" << endl;tree.print_infixOrder(tree.root);cout << endl << " 递归后序遍历" << endl;tree.print_postOrder(tree.root);tree.preOrder();tree.infxOrder();tree.postOrder();return 0;
}

结果:

二叉树递归和非递归遍历相关推荐

  1. 二叉树的几种递归和非递归式遍历:

    二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...

  2. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)

    分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...

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

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

  4. 九十五、二叉树的递归和非递归的遍历算法模板

    @Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...

  5. 二叉树层序遍历递归与非递归_二叉树基础(1)-构建和遍历(递归和非递归)...

    二叉树的构建有2种方式:1.直接输入数字.2.根据两种顺序来判断另外一中顺序(后面会提到) 这里分享第一种构建方式,二叉树的前中后三种遍历方式(递归和非递归版本),和二叉树的层次遍历. 见代码demo ...

  6. 二叉树的遍历:先序 中序 后序遍历的递归与非递归实现及层序遍历

    二叉树的定义:一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树 树节点的定义如下: // 树(节点)定义 struct TreeNode {int data; // 值TreeNode* l ...

  7. 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)

    本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...

  8. 二叉树创建及遍历算法(递归及非递归)(转)

    //二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...

  9. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

  10. 二叉树的层序遍历,前序遍历(递归,非递归),中序遍历(递归,非递归),后续遍历(递归,非递归)

    文章目录 二叉树的层序遍历 前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 后序遍历 递归版本 非递归版本 二叉树的层序遍历 void printTree(BinaryTree* ar ...

最新文章

  1. [JAVA EE] JPA技术基础:完成数据列表的删除
  2. 【Matlab数据的可视化】自适应绘图函数fplot
  3. BRIEF描述子生成算法
  4. 专属含PCR抑制剂的环境样本微生物拷贝数定量的最佳解决方案!
  5. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
  6. 微软考虑将 Python 作为 Excel 官方脚本语言
  7. 百度Q2扭亏为盈,市值一夜大涨300亿,李彦宏:呼唤猛将雄兵,要再上行业之巅...
  8. python三引号注释_python3学习笔记(三):注释和字符串
  9. ###STL学习--标准模板库
  10. 【网络安全】某安全网关前端JS分析
  11. php 自动签到源码,我也来发个自动签到脚本,PHP版
  12. 基地址和偏移地址的概念
  13. Spark _12_每个网址的每个地区访问量 ,由大到小排序
  14. python3 多线程_Python3多线程爬虫实例讲解
  15. Linux系统安装证书(ubuntu、centos7)
  16. Golang 二叉树系列【二叉树深度】
  17. centos自带python2.6升级到python2.7。并解决yum pip easy_install pip等模块兼容性问题
  18. Hangfire使用MySQL出现The Command Timeout expired before the operation completed
  19. 1块钱30分钟利用华为云服务器配置一台云电脑并搭建一个简易网站(步步截图较详细)
  20. 电脑文件误删除如何恢复?试下这3招

热门文章

  1. 12306自动抢票及自动识别验证码功能(一)
  2. python读取身份证照片信息_20行代码教你用Python改变身份证照片的背景色,python,给,证件照,换,底色...
  3. prim算法直观理解与证明
  4. sklearn决策树(Decision Trees)模型
  5. UltraISOPE 9.6.2.3059简体中文注册版/单文件版+软碟通
  6. 音视频直播如何实现低延迟
  7. element 时间选择器禁止选择以前或以后的时间
  8. 许奔创新社-第18问:静默头脑风暴怎么玩?
  9. x64dbg破解一个简单的Demo教程
  10. Mac OS 安装 OpenMPI