二叉树前中后序递归的本质


二叉树递归实现前中后序遍历非常的简单,只需要调整处理语句出现的位置即可。

void order(TreeNode* root)
{if (!root) return;//前序order(root->left);//中序order(root->right);//后序
}

二叉树每个节点都会被经过三次,我们使其每个位置都打印节点。

void order(TreeNode* root)
{if (!root)return;cout << root->val << " ";order(root->left);cout << root->val << " ";order(root->right);cout << root->val << " ";
}

如果只取第一次出现的节点,那就是前序遍历,只取第二次出现的节点那就是中序遍历,只取第三次出现的节点就是后序遍历。这种遍历序列可以称为递归序。


非递归实现前中后序

前序遍历

前序遍历非递归比较好理解,需要利用到一个栈来模拟递归过程。

代码示例:


void prevOrderNonR(TreeNode* root)
{if (!root) return;stack<TreeNode*> st;st.push(root);while (!st.empty()){TreeNode* cur = st.top();st.pop();cout << cur->_val << " ";if (cur->_right)st.push(cur->_right);if (cur->_left)st.push(cur->_left);}}

后续遍历:

上面使用栈实现了二叉树的前序遍历,在此基础上稍作修改就可以实现后续遍历。
众所周知,二叉树的前序遍历顺序为 根 左子树 右子树

我们改变前序遍历的压入节点的顺序,原先为先push右子树,再push左子树。现在改变其顺序,先压左,在压右。
此时前序遍历的顺序变为 根 右子树 左子树

后序遍历的顺序为 左子树 右子树 根,有没有发现,后序遍历序列的顺序就是上述变形序列的逆序。

代码示例:

 vector<int> postorderTraversal(TreeNode* root) {vector<int> ret;if(!root)   return ret;stack<TreeNode*> helper;stack<TreeNode*> post;helper.push(root);while(!helper.empty()){TreeNode* node = helper.top();helper.pop();post.push(node); // 并不直接处理,存入一个栈中if(node->left)helper.push(node->left);  //改变节点入栈顺序,先压左 if(node->right)helper.push(node->right);//再压右}//此时这个栈的弹出序列就为后序遍历序列while(!post.empty()){ret.push_back(post.top()->val);post.pop();}return ret;}

中序遍历:

代码示例:

void inOrderNonR(TreeNode* root)
{if (!root) return;stack<TreeNode*> st;TreeNode* cur = root;while (cur || !st.empty()){if (cur != nullptr){st.push(cur);cur = cur->_left;}else{cur = st.top();st.pop();cout << cur->_val << ' ';cur = cur->_right;}}
}

二叉树前中后序遍历及其本质相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 二叉树非递归dfs——简单思路搞定前中后序遍历

    前言:相信很多同学都被二叉树非递归dfs的前中后序遍历方法弄的头疼.网上的答案,什么前中后序遍历各有一套写法,还有什么一个栈的写法,两个栈的写法.看起来能理解,一闭眼自己写都记不住.今天介绍一种用一种 ...

  10. python实现二叉树非递归前中后序遍历

    python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...

最新文章

  1. strcpy与strncpy的区别
  2. 春运背后默默守护高铁安全的“隐形人”
  3. 【百家稷学】卷积神经网络的前世、今生与未来(武汉工程大学技术分享)
  4. IOS开发调用系统相机和打开闪光灯
  5. 第1节 kafka消息队列:7、kafka的消费模型
  6. lucene使用3.0.3_Jirasearch 2.0狗粮:使用Lucene查找我们的Jira问题
  7. java entity转dto_java 使用反射在dto和entity 实体类之间进行转换
  8. oracle中断进程,中断ORACLE数据库关闭进程导致错误案例
  9. 拿什么重建你,巴黎圣母院?
  10. c语言 字节 半字 字,PLC的位,半字节,字节,字介绍
  11. php 异步执行shell脚本
  12. 上海市二级c语言软件环境,上海市2019年9月计算机二级考试复习教程:(C语言)上机考试新版题库+全真模拟试卷(2本装)...
  13. Funcode实现打飞虫1
  14. android rs232串口协议,RS232串口协议详解
  15. has no attribute _TensorLike
  16. 前端剑法第三式————碎岩
  17. 蚂蚁监控平台 - antmonitor架构设计
  18. VTK笔记-CT图像获取皮肤等值面-vtkContourFilter类的使用
  19. oracle触发器ora01403,Oracle常见错误:ORA-01403 的根本原因和解决方案
  20. 全国市场调查大赛经验分享(三)

热门文章

  1. CDH6离线安装教程
  2. 红外与可见光图像融合(二)之思维导图
  3. 【Unity实战100例】Unity读取加载Gif动图的两种方式
  4. 三大开源bi工具_bi智能报表,好用的开源报表工具
  5. c语言数据结构实验约瑟夫(Josephu)问题
  6. VSCode安装LeetCode插件
  7. ESP32 AT指令集 BT SPP测试
  8. opencv国内快速下载
  9. 防火电缆分类、标准、阻燃等级划分详细说明
  10. 机器人标准DH建模法