二叉树非递归遍历(先序、中序、后序)(C++)

  • 1、先序遍历非递归
  • 2、中序遍历非递归
    • 2.1、搜索某节点的最左侧节点
    • 2.2、中序遍历非递归代码
  • 3、后序遍历非递归
    • 3.1、修改后的节点结构
    • 3.2、搜索某节点的最左侧节点
    • 3.3、后序遍历非递归代码

1、先序遍历非递归

//先序遍历非递归算法
template<class ElemType>
void NonRecurPreOrder(const BinaryTree<ElemType>& bt, void(*visit)(const ElemType&))
{const BinTreeNode<ElemType>* cur = bt.GetRoot();//当前节点LinkStack<const BinTreeNode<ElemType>*>s;//栈while (cur != NULL){//处理当前节点(*visit)(cur->data);//访问当前节点s.Push(cur);//当前节点入栈if (cur->leftChild != NULL){//cur的先序序列后继为cur->leftChildcur = cur->leftChild;}else if (!s.Empty()){//cur的先序序列后继为栈s的栈顶节点的非空右孩子while (!s.Empty()){s.Pop(cur);//取出栈顶节点cur = cur->rightChild;//栈顶的右孩子if (cur != NULL) break;//右孩子非空即为先序序列后继}}else{//栈s为空,无先序序列后继cur = NULL;//无先序序列后继}}
}

2、中序遍历非递归

2.1、搜索某节点的最左侧节点

//搜索某节点的最左侧节点
//操作结果:返回以r为根的最左侧的节点,并将搜索过程中的节点加入到栈s中
template<class ElemType>const BinTreeNode<ElemType>* GoFarLeft(const BinTreeNode<ElemType>* r, LinkStack<const BinTreeNode<ElemType>*>& s)
{if (r == NULL){//空二叉树return NULL;}else{//非空二叉树const BinTreeNode<ElemType>* cur = r;//当前节点while (cur->leftChild != NULL){//cur如果存在左孩子,则cur移向左孩子s.Push(cur);//cur入栈cur = cur->leftChild;//cur移向左孩子}return cur;//cur为最左侧节点}
}

2.2、中序遍历非递归代码

//中序遍历非递归算法
template<class ElemType>
void NonRecurInOrder(const BinaryTree<ElemType>& bt, void (*visit)(const ElemType&))
{const BinTreeNode<ElemType>* cur;//当前节点LinkStack<const BinTreeNode<ElemType>*>s;//栈cur = GoFarLeft<ElemType>(bt.GetRoot(), s);//cur为二叉树的最左侧的节点while (cur!=NULL){//处理当前节点(*visit)(cur->data);//访问当前节点if (cur->rightChild != NULL){//cur的中序序列后继为右子树的最左侧的节点cur = GoFarLeft(cur->rightChild, s);}else if (!s.Empty()){//cur的中序序列后继为栈s的栈顶节点s.Pop(cur);//取出栈顶节点}else{//栈s为空,无中序序列后继cur = NULL;//无中序序列后继}}
}

3、后序遍历非递归

3.1、修改后的节点结构

//修改后的二叉树节点类模板
template<class ElemType>
struct ModiNode
{const BinTreeNode<ElemType>* node;//指向节点bool rightSubTreeVisited;//是否右子树已被访问
};

3.2、搜索某节点的最左侧节点

//返回以r为根的二叉树最左侧的被修改后的节点,并将搜索过程中的被修改后的节点加入到栈s中
template<class ElemType>
ModiNode<ElemType>* GoFarLeft(const BinTreeNode<ElemType>* r, LinkStack<ModiNode<ElemType>*>& s)
{if (r == NULL){//空二叉树return NULL;}else{//非空二叉树const BinTreeNode<ElemType>* cur = r;//当前节点ModiNode<ElemType>* newPtr;//被修改后的节点while (cur->leftChild!=NULL){//cur存在左孩子,则cur移向左孩子newPtr = new ModiNode<ElemType>;newPtr->node = cur;//指向节点newPtr->rightSubTreeVisited = false;//表示右子树未被访问s.Push(newPtr);//nodePtr入栈cur = cur->leftChild;//cur移向左孩子}newPtr = new ModiNode<ElemType>;newPtr->node = cur;//指向节点newPtr->rightSubTreeVisited = false;//表示右子树未被访问return newPtr;//newPtr为最左侧的被修改后的节点}
}

3.3、后序遍历非递归代码

//后序遍历二叉树非递归
template<class ElemType>
void NonRecurPostOrder(const BinaryTree<ElemType>& bt, void (*visit)(const ElemType&))
{ModiNode<ElemType>* cur;//当前被搜索点LinkStack<ModiNode<ElemType>*>s;//栈cur = GoFarLeft<ElemType>(bt.GetRoot(), s);//cur为二叉树最左侧的被修改后的节点while (cur!=NULL){//处理当前节点if (cur->node->rightChild == NULL || cur->rightSubTreeVisited){//当前节点右子树为空或右子树已被访问(*visit)(cur->node->data);//访问当前节点delete cur;//释放空间if (!s.Empty()){//栈非空,则栈顶元素将指示下一次需要访问的节点s.Pop(cur);//出栈}else{//栈空,遍历完毕cur = NULL;}}else{//当前节点右子树未被访问cur->rightSubTreeVisited = true;//下一次出现在栈顶时的右子树已被访问s.Push(cur);//入栈cur = GoFarLeft<ElemType>(cur->node->rightChild, s);//搜索右子树最左侧的节点}}}

二叉树非递归遍历(先序、中序、后序)(C++)相关推荐

  1. C++版二叉树非递归遍历

    C++版二叉树非递归遍历 文章目录 C++版二叉树非递归遍历 一.二叉树前序遍历 二.二叉树中序遍历 三.二叉树后序遍历 一.二叉树前序遍历 /*** Definition for a binary ...

  2. 一种二叉树非递归遍历的简单写法

    一种二叉树非递归遍历的简单写法 目录 一种二叉树非递归遍历的简单写法 先序遍历 中序遍历 后序遍历 二叉树的遍历是数据结构中非常基础的一个知识点,也是面试手撕代码环节的一个常见题目.这个问题的递归写法 ...

  3. 二叉树非递归遍历(模版)

    读完本篇内容大约花费您7分钟时间 本文主要讲解二叉树非递归遍历,由于是非递归遍历,所以需要用到栈stack,我们如果仔细考虑递归遍历的代码,就能明白非递归种栈的应用. 由于几种遍历方式只是在处理中间节 ...

  4. 二叉树的非递归遍历(前序中序后序非递归C语言)

    前两天做数据结构实验,要求用非递归算法遍历二叉树.只知道用栈来储存数据,具体算法还不太清楚.经过两天的搜索,看到网上很多种解法,很多解法都是用C++来写的算法,一直找不到用C语言写的算法,所以就总结了 ...

  5. 二叉树非递归遍历的一点理解

    二叉树是我们必须要了解的一个数据结构,针对这个数据结构我们可以衍生出好多知识. 主要是有几种遍历方式,前序遍历,中序遍历,后续遍历,层次遍历. 下面我们根据这个图来详细的说一下这几种非递归遍历的思想与 ...

  6. 二叉树的操作(前,中,后序遍历也叫深度优先遍历,非空结点的个数)递归实现

    定义一个二叉树的结点 二叉树的前序遍历, 先访问根结点,再访问左,再访问右. 每次访问都要先看根结点是否为空,然后打印根结点,把此时根结点的左结点作为下一次递归的根结点,当把左结点遍历完后,再遍历右结 ...

  7. 二叉树非递归遍历的经典求解

    #include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct node {dataty ...

  8. 数据结构_二叉树非递归遍历

    package zz;import java.util.Stack;/*** 二叉树中的二叉搜索树,即一个节点的左子节点关键值小于这个节点,右子节点的关键值大于这个节点* * @author Admi ...

  9. 二叉树非递归遍历实现(Java)

    首先理解一下二叉树节点结构.left指向左节点,right指向右节点,val为节点中的值. class TreeNode {int val;TreeNode left;TreeNode right;p ...

  10. 二叉树的非递归遍历(c/c++)

    由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...

最新文章

  1. js 打印的一些技巧 去除页眉页脚,主动分页
  2. nyoj-138-找球号(二)----hash算法之除留余数法+vector
  3. 使用LVS实现负载均衡原理及安装配置详解
  4. numpy和pandas的基础索引切片
  5. libgdx 学习笔记七 libgdx应用程序生命周期
  6. 精简jdk包_在JDK 12精简数字格式中使用最小分数数字
  7. K-近邻算法(KNN)概述
  8. 使用.htaccess文件为站点文件夹设置密码保护
  9. ASP.NET 百万级分页查询续
  10. VC++编程中的文件操作API和CFile类
  11. CSS3常用功能 旋转等
  12. Okhttp之CallServerInterceptor简单分析
  13. 关于SQL数据字典的详解
  14. java math类 平方_Java Math类
  15. mysql中unl是什么健_UNL类图关系全面剖析
  16. 项目应用案例:智慧灯杆、交互式投影装置等将助成都锦城大道变身“智慧大街”
  17. SmokePing安装手册
  18. 【转】地心历险记 2:神秘岛 迅雷 下载 地址|神秘岛 高清 下载地址
  19. iOS 绘图(drawrect)图片裁剪的红色框框
  20. python作业——SVM预测交通流量

热门文章

  1. 【QT】QT事件处理
  2. 数据结构系列,二叉平衡树的构建
  3. 二叉查找树与平衡二叉树
  4. 区块链开发入门到精通
  5. melodic版本ROS使用anaconda中的python
  6. 利用Tampermonkey写脚本抢课
  7. 批量转移文件,并修改图片的位深度、灰度等信息
  8. 云计算机怎么给学生机安装软件,如何在云计算机服务器中安装学生机应用程序? 在云计算机服务器中安装学生机应用程序的方法?...
  9. 经验模态分解python_EMD经验模态分解
  10. mysql时间类型英文_英文日期格式及缩写