/*
二叉树前中后/层次遍历的递归与非递归形式*/
//***************void preOrder1(BinaryTreeNode* pRoot)
{if(pRoot==NULL)return;cout<<pRoot->value;if(pRoot->left!=NULL)preOrder1(pRoot->left);if(pRoot->right!=NULL)preOrder1(pRoot->right);
}void preOrder2(BinaryTreeNode* pRoot)
{stack<BinaryTreeNode*> s;BinaryTreeNode *p=pRoot;if(pRoot==NULL)return;while(p!=NULL||!s.empty()){while(p!=NULL){cout<<p->value<<" ";s.push(p);p=p->left;}if(!s.empty()){p=s.top();s.pop();p=p->right;}}
}void preOrder2(BinaryTreeNode* pRoot){if(pRoot==NULL)return;stack<BinaryTreeNode*> s;  s.push(root);BinaryTreeNode* p;while(!s.empty()){p = s.top();cout<<p->data;//遍历根结点s.pop();if(p>right){s.push(p->right);  //先将右子树压栈}if(p->left){s.push(p->left);  //再将左子树压栈}}
}//*****************//中序遍历
void inOrder1(BinaryTreeNode* pRoot)
{if(pRoot==NULL)return;if(pRoot->left!=NULL)inOrder1(pRoot->left);cout<<pRoot->value;if(pRoot->right!=NULL)inOrder1(pRoot->right);
}void inOrder2(BinaryTreeNode* pRoot)
{stack<BinaryTreeNode*> s;BinaryTreeNode *p=pRoot;if(pRoot==NULL)return;while(p!=NULL||!s.empty()){while(p!=NULL){ s.push(p);p=p->left;}if(!s.empty()){p=s.top();cout<<p->value<<" ";s.pop();p=p->right;}}
}//*****************//后序遍历
void postOrder1(BinaryTreeNode* pRoot)
{if(pRoot==NULL)return;postOrder1(pRoot->left);postOrder1(pRoot->right);cout<<pRoot->value<<" ";
}void postOrder2(BinaryTreeNode* pRoot)
{stack<BinaryTreeNode*> s;BinaryTreeNode *cur;BinaryTreeNode *pre=NULL;//记录上一个输出的节点s.push(pRoot);//根结点入栈while(!s.empty()){cur=s.top();if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right))){//左孩子和右孩子同时为空,或者当前结点的左孩子或右孩子已经遍历过了cout<<cur->value<<" ";s.pop();pre=cur;}else{if(cur->right!=NULL)s.push(cur->right);if(cur->left!=NULL)s.push(cur->left);}}
}//*****************
//层次遍历,使用队列
void PrintFromTopToBottom(BinaryTreeNode* pRoot)
{if(pRoot == NULL)return;deque<BinaryTreeNode *> dequeTreeNode;dequeTreeNode.push_back(pRoot);while(dequeTreeNode.size()){BinaryTreeNode *pNode = dequeTreeNode.front();dequeTreeNode.pop_front();cout<<pNode->m_nValue<<" ";if(pNode->m_pLeft)dequeTreeNode.push_back(pNode->m_pLeft);if(pNode->m_pRight)dequeTreeNode.push_back(pNode->m_pRight);}
}//深度优先遍历~先序遍历
void dfs(BinaryTreeNode* root){stack<BinaryTreeNode* *> nodeStack;  nodeStack.push(root);Node *node;while(!nodeStack.empty()){node = nodeStack.top();cout<<node->data;//遍历根结点nodeStack.pop();if(node->rchild){nodeStack.push(node->rchild);  //先将右子树压栈}if(node->lchild){nodeStack.push(node->lchild);  //再将左子树压栈}}
}//广度优先遍历~层次遍历
void bfs(BinaryTreeNode* root){queue<BinaryTreeNode* *> nodeQueue;  nodeQueue.push(root);Node *node;while(!nodeQueue.empty()){node = nodeQueue.front();nodeQueue.pop();cout<<node->data;//遍历根结点if(node->lchild){nodeQueue.push(node->lchild);  //先将左子树入队}if(node->rchild){nodeQueue.push(node->rchild);  //再将右子树入队}}
}

  

转载于:https://www.cnblogs.com/zhang-qc/p/9344824.html

二叉树前中后/层次遍历的递归与非递归形式(c++)相关推荐

  1. 二叉树前中后序遍历以及节点计算

    二叉树前中后序遍历以及节点计算 二叉树 分类 二叉链的数据结构 三叉链的数据结构 四种遍历方法 深度优先遍历:前中后序 广度优先遍历:层序遍历 计算 节点个数 叶子节点个数 树的高度 第k层的节点个数 ...

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

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

  3. 二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法

    关于二叉树的前序遍历(preoder).中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是 ...

  4. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】

    文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...

  5. 二叉树前中后层遍历(递归/非递归)(简单易懂(*^ー^))

    文章目录 二叉树的遍历 1 先序遍历 1.1 递归 1.2 非递归 2 中序遍历 2.1 递归 2.2 非递归 3 后序遍历 3.1 递归 3.2 非递归 4 层序遍历 5 前中后层序完整可运行代码( ...

  6. 【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题

    写在前面 学习二叉树结构,最简单的方式就是遍历.所谓二叉树遍历,就是按照某种特定的规则,一次对二叉树中的节点进行相应的操作,并且每个节点只操作一次. 访问节点所做的操作要看具体的应用问题.遍历是二叉树 ...

  7. LeetCode——树:层次遍历、前中后序遍历

    LeetCode--树:层次遍历.前中后序遍历 目录 层次遍历 二叉树的层平均值 找树左下角的值 前中后序遍历 概述 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 ...

  8. 数据结构-二叉树(包含二叉树的层次建树、前中后序遍历、层次遍历解析及代码)

    目录 一.树与二叉树的原理解析 1.树的定义 2.树的结构和特点 3.二叉树的定义 4.树结点的数据结构 二.二叉树的层次建树 1.二叉树层次建树的原理及分析 2.完整代码 三.二叉树的前中后序遍历 ...

  9. [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

    [问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...

  10. 二叉树的层序遍历和前中后序遍历代码 迭代/递归

    二叉树的层序遍历和前中后序遍历代码 迭代/递归 只记录代码.思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/mast ...

最新文章

  1. 阿里资深AI工程师教你逐个击破机器学习核心算法
  2. java 时间的封装类
  3. python将数据存入数据库_python3 两种方法将数据存入mysql数据库
  4. 堆内存与栈内存的区别
  5. WeChat:微信小程序设计流程注册完善、设计开发、审核发布之详细攻略
  6. 流放之路材质过滤怎么设置_房子装修,前置过滤器怎么选?看这6个要点
  7. FAILED: Error in metadata: MetaException(message:Got exception: java.net.ConnectException
  8. php maximum,解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示...
  9. 为什么物联网大数据平台,使用TDengine,可不要redis, kafka, spark等软件?
  10. html5游戏开发-零基础开发RPG游戏-开源讲座(四)
  11. SQL Server 和 Oracle 的常用函数对比
  12. VScode+远程服务器docker+C/C++ 代码挑战配置
  13. testng依赖_TestNG依赖关系–DependOnMethods,dependsOnGroups
  14. 向Spark的DataFrame增加一列数据
  15. vue项目echarts通过cdn或npm引入
  16. wpsword怎样涂黑方框_Excel中如何插入空心小方块和实心小方块的标志?
  17. 神经系统疾病题库【1】
  18. API 接口大全之 1688
  19. promise一脸懵逼...
  20. ajax/jason

热门文章

  1. 【渝粤教育】国家开放大学2019年春季 2633轨道交通信号与通信系统 参考试题
  2. [渝粤教育] 西南科技大学 刑法学 在线考试复习资料(1)
  3. 【渝粤教育】广东开放大学 民族音乐概论 形成性考核 (58)
  4. Linux系统(二)常用命令、进程管理
  5. /usr/bin/ld: 找不到 -lglut
  6. 矩阵分解在推荐系统中的应用:NMF和经典SVD实战(2)
  7. 一种修复WSL下linux系统问题的方法
  8. ArcGIS API for JavaScript与 npm
  9. Luogu P3223 [HNOI2012]排队 组合
  10. 给 Chrome浏览器 添加 Javascript小书签,查看当前页面全部加载的javascript文件及代码片段...