题目来源

94. 二叉树的中序遍历

题目描述

struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};class Solution {public:vector<int> inorderTraversal(TreeNode* root) {}
}

题目解析

morrios遍历

 void morris(TreeNode * head){if(head == nullptr){return;}TreeNode *curr = head;TreeNode *mostRight = nullptr;while (curr != nullptr){mostRight = curr->left;if(mostRight == nullptr){printf("%d\t", curr->val);curr = curr->right;}else{while (mostRight->right != nullptr && mostRight->right != curr){mostRight = mostRight->right;}if(mostRight->right == nullptr){mostRight->right = curr;curr = curr->left;}else{printf("%d\t", curr->val);mostRight->right = nullptr;curr = curr->right;}};}}

递归

class Solution {public:vector<int> inorderTraversal(TreeNode* root) {vector<int> ans;helper(root, ans);return ans;}private:void helper(TreeNode* root, vector<int> & ans){if(root == NULL){return ;}helper(root->left, ans);ans.emplace_back(root->val);helper(root->right, ans);}
};

null标记法

  • 入栈顺序: 右、中、null、左
    vector<int> inorderTraversal(TreeNode* root) {vector<int> vec;if(root == NULL){return vec;}std::stack<TreeNode *> stack;stack.emplace(root);while (!stack.empty()){TreeNode *peek = stack.top();stack.pop();if(peek == NULL){vec.emplace_back(stack.top()->val);stack.pop();}else{if(peek->right){stack.push(peek->right);}stack.push(peek);stack.push(NULL);if(peek->left){stack.push(peek->left);}}}return vec;}

颜色标记法

“颜色标记法”,兼具栈迭代方法的高效,又像递归方法一样间接易懂,更重要的是,这种方法对于前序、中序、后序遍历,能够写出完全一致的代码。

其核心思想如下:

  • 如果颜色标记节点的状态,新节点为白色,已访问节点为灰色

    • 如果遇到的节点为白色,那么将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈
    • 如果遇到的节点为灰色,那么将其节点的值输出。

解释一下为什么需要“右子节点、自身、左子节点依次入栈”

  • 我们有一颗二叉树

    • 前序遍历:中、左、右
    • 中序遍历:左、中、右
    • 后序遍历:左、右、中
               中/  \左   右
  • 如果需要中序遍历。

    • 栈是先进后出的结构,出栈顺序需要为: 左、中、右
    • 所以,入栈顺序必须倒序: 右、中、左
  • 同理,如果是前序遍历,入栈顺序为 右,左,中;后序遍历,入栈顺序中,右,左

使用这种方法实现的中序遍历如下:

typedef int  STATUS;
STATUS WHITE = 0;
STATUS GRAP = 1;vector<int> inorderTraversal(TreeNode* root) {vector<int> vec;if(root == NULL){return vec;}std::stack<std::pair<STATUS, TreeNode *>> stack;stack.push({WHITE, root});while (!stack.empty()){STATUS status = stack.top().first;TreeNode * node = stack.top().second;stack.pop();if(status == WHITE){if( node->left != NULL){stack.push({WHITE, node->left});}stack.push({GRAP, node});if( node->right != NULL){stack.push({WHITE, node->right});}}else{vec.emplace_back(node->val);}}return vec;
}

如要实现前序、后序遍历,只需要调整左右子节点的入栈顺序即可。

leetcode:94. 二叉树的中序遍历相关推荐

  1. leetcode - 94. 二叉树的中序遍历

    给定一个二叉树,返回它的中序遍历.中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历.中序周游.在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树. 示例: 进阶: 递归算法很简单, ...

  2. LeetCode 94. 二叉树的中序遍历(中序遍历)

    文章目录 1. 题目信息 2. 解题 2.1 递归 2.2 循环,必须掌握 1. 题目信息 给定一个二叉树,返回它的中序 遍历. 示例:输入: [1,null,2,3]1\2/3输出: [1,3,2] ...

  3. Leetcode 94.二叉树的中序遍历 (每日一题 20210712)

    给定一个二叉树的根节点 root ,返回它的 中序 遍历.示例 1:输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2:输入:root = [] 输出:[] 示例 3:输入: ...

  4. 力扣(Leetcode)-94. 二叉树的中序遍历

    描述 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 ...

  5. [leetcode]94.二叉树的中序遍历

    给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: ...

  6. leetcode| 94. 二叉树的中序遍历

    ##给定一个二叉树,返回它的中序遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 栈. 思路 时间复杂度O( ...

  7. Leetcode 94. 二叉树的中序遍历 解题思路及C++实现

    解题思路: 中序遍历的顺序是:左根右.所以需要使用一个栈来存储根节点(每一次push操作时,都相当于把该节点当成根节点了,然后再向其左节点探索). 程序中的大循环是:!s.empty() || roo ...

  8. LeetCode 94. 二叉树的中序遍历(递归)(迭代)(颜色标记法)

    题目描述 给定一个二叉树,返回它的后序遍历 思路 详见链接 代码 递归 #class TreeNode: # def __init__(self,x): # self.val = x # self.l ...

  9. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  10. LeetCode-二叉树-94. 二叉树的中序遍历

    描述 94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root ...

最新文章

  1. 我用java爬了一下CSDN,发现了这些秘密。。。
  2. LeetCode 804 Unique Morse Code Words--python,java解法
  3. 如何促使团队紧密协作
  4. Hadoop技术之Hadoop HA 机制学习
  5. POJ - 2914 Minimum Cut(全局最小割-Stoer_Wagner)
  6. C# SQLite 数据库操作实例2
  7. 全链路压测平台(Quake)在美团中的实践
  8. 各种简单的困难的模板,持续更新
  9. ubuntu nginx php问题研究
  10. Tex, LaTex概念及实例
  11. php input file 上传文件类型,php轻松实现文件上传功能
  12. .net伪静态传多个参数
  13. 查看Linux占用内存/CPU最多的进程
  14. Maven--Cargo远程部署
  15. Luogu3941[湖南集训2017] 入阵曲
  16. talentcentral测评结果_热门推荐!雅诗兰黛2021笔试攻略,最新版Talent Central笔试真题!...
  17. EasyUI icon 小图标库,应有尽有(5000多个)打包下载
  18. 35岁的程序员:第44章,宿命
  19. Matlab(将2维图片显示成3维图形)
  20. WordPress主题_大前端DUX主题7.1原版+优化-91apps.cn就要应用网

热门文章

  1. 利用牛顿迭代公式开方
  2. ad18常用快捷键可以修改吗_AD18的常用操作及快捷键
  3. 《她身之欲》(珠三角阅流动人口社群特殊职业研究)阅读感想
  4. 关于OriginPRO/Origin画图消锯齿以及平滑点与点之间的连接
  5. CRACK小试牛刀:关于GALGAME银色遥远爆破记录
  6. 走进脑计划(四):linux下安装SPM、DPABI
  7. CTF之MISC练习一
  8. 非常详细的范式讲解(1NF/2NF/3NF/BCNF)
  9. 【读书笔记】投资中最简单的事-邱国鹭,别人恐惧我贪婪,别人贪婪我respect
  10. php网站视频播放外链,视频直接上传到七牛上,在浏览器中输入外链为什么不能直接播放?...