二叉树的前序遍历

递归实现

递归实现没什么好说的。个人感觉将函数功能看成一个整体,不要去想栈中怎么实现的。毕竟自己的脑袋不是电脑,绕着绕着就蒙了。

void preordered_traversal_recursion(TreeNode* root)
{if(root == NULL) return;container.push_back(root->val);preordered_traversal_recursion(root->left);preordered_traversal_recursion(root->right);
}

迭代实现

迭代通过栈来实现,具体过程如下图所示。

函数实现:

void preordered_traversal_iteration(TreeNode* root)
{stack<TreeNode*> tree_s;if(root == NULL) return;tree_s.push(root);while(!tree_s.empty()){TreeNode* node = tree_s.top();tree_s.pop();// 取出中间节点的值container.push_back(node->val);// 右节点if(node->right) tree_s.push(node->right);// 左节点if(node->left)  tree_s.push(node->left);}return;
}

二叉树的后序遍历

递归

void postordered_traversal_recursion(TreeNode* root)
{if(root == NULL) return;postordered_traversal_recursion(root->left);postordered_traversal_recursion(root->right);container.push_back(root->val);
}

迭代

后序遍历的顺序为左右中。在不知道中间节点的情况下无法获得左、右节点。因此先遍历中右左,然后reverse一下就行了。
  
函数实现:

void postordered_traversal_iteration(TreeNode* root)
{stack<TreeNode*> tree_s;if(root == NULL) return;tree_s.push(root);while (!tree_s.empty()){TreeNode* node = tree_s.top();tree_s.pop();container.push_back(node->val);if(node->left)  tree_s.push(node->left);if(node->right)  tree_s.push(node->right);}reverse(container.begin(),container.end());return;
}

二叉树的中序遍历

递归

void inordered_traversal_recursion(TreeNode* root)
{if(root == NULL) return;inordered_traversal_recursion(root->left);container.push_back(root->val);inordered_traversal_recursion(root->right);
}

迭代

中序遍历的迭代比较麻烦。因为其遍历顺序为左中右。在不知道中间节点的情况下,无法取出左节点的值。
迭代的基本思想是:1)将左侧的节点全部压入栈中。2)取出栈顶元素,即最左下角的节点。3)判断该节点有没有右节点,有右节点的话,压入栈中,然后重复1),2)。没有的话,继续弹出栈顶元素。

看下面的图可能会比较好理解。
函数实现:

void inordered_traversal_iteration(TreeNode* root)
{stack<TreeNode*> tree_s;if(root == NULL) return;while(!tree_s.empty() || root != NULL){// 将左侧节点全部压入栈中,找到最左侧的节点while(root != NULL){tree_s.push(root);root = root->left;}// 取出最左侧的节点root = tree_s.top();tree_s.pop();container.push_back(root->val);// 从最左侧节点的右节点开始新的一轮遍。root = root->right;}
}

二叉树的前序,中序,后序的递归、迭代实现相关推荐

  1. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

  2. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

  3. 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】

    1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...

  4. java数据结构学习笔记-二叉树前、中、后序遍历

    public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...

  5. 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】

    1.前序遍历 #include <iostream> #include <vector> #include <queue> #include <algorit ...

  6. 二叉树前、中、后序线索化及遍历

    public class ThreadedBinaryTree {public static void main(String[] args){Heronodes node1=new Heronode ...

  7. 二叉树根据前序遍历和后序遍历,求解中序遍历

    既然是树,还是用根来描述更为贴切,先把根遍历出来,再遍历左右子树,就是先根遍历:后根遍历就是先把左右子树遍历出来,再把根遍历出来:只要牢记一点,不论怎么遍历,规则同样要作用于子树. 比如上图,先根遍历 ...

  8. 用前序中序创建二叉树(用中序后序创建二叉树)

    定义二叉树结点 比如就拿这个二叉树 前序中序创建 因为前序遍历的顺序是 根 , 左 ,右. 中序的遍历是 左 根 右. 我们会很不好想,但我们可以用前序和中序把上面那个二叉树的遍历一边 前序遍历:AB ...

  9. 数据结构 - 二叉树(前序中序后序查找)

    public static int i = 1, j = 1, k =1;//编写前序查找方法public HeroNode preOrderSearch(int no){System.out.pri ...

  10. 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++

    a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...

最新文章

  1. 【知识积累】SBT+Scala+MySQL的Demo
  2. (0086)iOS开发之iPhone 屏幕尺寸、分辨率、ppi以及@2x@3x图
  3. 使用正则替换文件头注释
  4. ABAP算术运算函数
  5. ASP.NET Core必备笔试题(含答案)
  6. tsp 选边 matlab,【转载】蚁群算法TSP(旅行商问题)通用matlab程序
  7. python生成表达式_说说 Python 的生成器表达式
  8. [机器学习-概念篇]彻底搞懂信息量,熵、相对熵、交叉熵
  9. 计算机网络考研笔记(持续更新)
  10. 图书管理系统需求分析
  11. 如何在linux系统下训练tensorflow深度学习模型
  12. 30分钟了解蒙特卡洛方法
  13. 电子邮件格式是什么,你知道电子邮件在哪里找吗
  14. html表格方式实现商品详情
  15. Android 中利用XPosed拦截系统消息
  16. html页面标尺,canvas实现标尺.html
  17. 基于DOA联合TDOA时间积累下二维平面GDOP
  18. python篮球弹跳训练方法_业余篮球爱好者的弹跳训练全攻略(附6个月训练计划)...
  19. ABAP - OO ALV基本实现步骤
  20. iphone开发 调用相机拍照

热门文章

  1. java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解
  2. 吸水间最低动水位标高_水库水位库容监测系统方案
  3. flask 学习实战项目实例
  4. 正向最大匹配 和逆向最大匹配对比比较
  5. Python 中 (,|)和(and,or)之间的区别 逻辑判断
  6. MindInsight计算图可视设计
  7. MLPerf结果证实至强® 可有效助力深度学习训练
  8. Xilinx Zynq FPGA Boards板
  9. python 字符串拼接
  10. This Gradle plugin requires a newer IDE able to request IDE model level 3.For Android Studio this