leetcode:94. 二叉树的中序遍历
题目来源
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. 二叉树的中序遍历相关推荐
- leetcode - 94. 二叉树的中序遍历
给定一个二叉树,返回它的中序遍历.中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历.中序周游.在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树. 示例: 进阶: 递归算法很简单, ...
- LeetCode 94. 二叉树的中序遍历(中序遍历)
文章目录 1. 题目信息 2. 解题 2.1 递归 2.2 循环,必须掌握 1. 题目信息 给定一个二叉树,返回它的中序 遍历. 示例:输入: [1,null,2,3]1\2/3输出: [1,3,2] ...
- Leetcode 94.二叉树的中序遍历 (每日一题 20210712)
给定一个二叉树的根节点 root ,返回它的 中序 遍历.示例 1:输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2:输入:root = [] 输出:[] 示例 3:输入: ...
- 力扣(Leetcode)-94. 二叉树的中序遍历
描述 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 ...
- [leetcode]94.二叉树的中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: ...
- leetcode| 94. 二叉树的中序遍历
##给定一个二叉树,返回它的中序遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 栈. 思路 时间复杂度O( ...
- Leetcode 94. 二叉树的中序遍历 解题思路及C++实现
解题思路: 中序遍历的顺序是:左根右.所以需要使用一个栈来存储根节点(每一次push操作时,都相当于把该节点当成根节点了,然后再向其左节点探索). 程序中的大循环是:!s.empty() || roo ...
- LeetCode 94. 二叉树的中序遍历(递归)(迭代)(颜色标记法)
题目描述 给定一个二叉树,返回它的后序遍历 思路 详见链接 代码 递归 #class TreeNode: # def __init__(self,x): # self.val = x # self.l ...
- Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历
Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...
- LeetCode-二叉树-94. 二叉树的中序遍历
描述 94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root ...
最新文章
- 我用java爬了一下CSDN,发现了这些秘密。。。
- LeetCode 804	Unique Morse Code Words--python,java解法
- 如何促使团队紧密协作
- Hadoop技术之Hadoop HA 机制学习
- POJ - 2914 Minimum Cut(全局最小割-Stoer_Wagner)
- C# SQLite 数据库操作实例2
- 全链路压测平台(Quake)在美团中的实践
- 各种简单的困难的模板,持续更新
- ubuntu nginx php问题研究
- Tex, LaTex概念及实例
- php input file 上传文件类型,php轻松实现文件上传功能
- .net伪静态传多个参数
- 查看Linux占用内存/CPU最多的进程
- Maven--Cargo远程部署
- Luogu3941[湖南集训2017] 入阵曲
- talentcentral测评结果_热门推荐!雅诗兰黛2021笔试攻略,最新版Talent Central笔试真题!...
- EasyUI icon 小图标库,应有尽有(5000多个)打包下载
- 35岁的程序员:第44章,宿命
- Matlab(将2维图片显示成3维图形)
- WordPress主题_大前端DUX主题7.1原版+优化-91apps.cn就要应用网
热门文章
- 利用牛顿迭代公式开方
- ad18常用快捷键可以修改吗_AD18的常用操作及快捷键
- 《她身之欲》(珠三角阅流动人口社群特殊职业研究)阅读感想
- 关于OriginPRO/Origin画图消锯齿以及平滑点与点之间的连接
- CRACK小试牛刀:关于GALGAME银色遥远爆破记录
- 走进脑计划(四):linux下安装SPM、DPABI
- CTF之MISC练习一
- 非常详细的范式讲解(1NF/2NF/3NF/BCNF)
- 【读书笔记】投资中最简单的事-邱国鹭,别人恐惧我贪婪,别人贪婪我respect
- php网站视频播放外链,视频直接上传到七牛上,在浏览器中输入外链为什么不能直接播放?...