[LeetCode] Binary Tree Inorder Traversal
2015-06-02 23:22
344 查看
This is a fundamental and yet classic problem. I share my three solutions here:
Iterative solution using stack ---
Recursive solution ---
Morris traversal ---
Iterative solution using stack:
Recursive solution:
Morris traversal:
Iterative solution using stack ---
O(n)time and
O(n)space;
Recursive solution ---
O(n)time and
O(n)space (considering the costs of call stack);
Morris traversal ---
O(n)time and
O(1)space!!!
Iterative solution using stack:
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> nodes; TreeNode* curNode = root; stack<TreeNode*> toVisit; while (curNode || !toVisit.empty()) { if (curNode) { toVisit.push(curNode); curNode = curNode -> left; } else { curNode = toVisit.top(); toVisit.pop(); nodes.push_back(curNode -> val); curNode = curNode -> right; } } return nodes; } };
Recursive solution:
class Solution { public: void inorder(TreeNode* node, vector<int>& nodes) { if (!node) return; inorder(node -> left, nodes); nodes.push_back(node -> val); inorder(node -> right, nodes); } vector<int> inorderTraversal(TreeNode* root) { vector<int> nodes; inorder(root, nodes); return nodes; } };
Morris traversal:
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> nodes; TreeNode* curNode = root; while (curNode) { if (curNode -> left) { TreeNode* predecessor = curNode -> left; while (predecessor -> right && predecessor -> right != curNode) predecessor = predecessor -> right; if (predecessor -> right == NULL) { predecessor -> right = curNode; curNode = curNode -> left; } else { predecessor -> right = NULL; nodes.push_back(curNode -> val); curNode = curNode -> right; } } else { nodes.push_back(curNode -> val); curNode = curNode -> right; } } return nodes; } };
相关文章推荐
- Slf4j MDC 使用和 基于 Logback 的实现分析
- Windows server 2008 R2安装MySQL 32位ODBC驱动!
- Windows server 2008 R2安装MySQL 32位ODBC驱动!
- [LeetCode] Binary Tree Preorder Traversal
- 养成写高效的SQL语句的习惯
- Solution of NumberOfDiscIntersections by Codility
- 1. 基本概念
- Unity3d_Stats和优化
- jQuery.extend()方法和jQuery.fn.extend()方法
- 【Android开发】线程与消息处理-通过实现Runnable接口来创建线程
- c#输出文件名、行号、函数名、列号
- 时间日期类型格式化
- [LeetCode] Contains Duplicate II
- 一个自动清理Android项目无用资源的工具类及源码 推荐
- MySQL中英文混合排序最简单的办法
- hdu 1042
- hdu 1087 Super Jumping! Jumping! Jumping!(dp)
- [LeetCode] House Robber II
- Centos 6.6 x86_64 Basic Server 快速安装httpd
- 【Android开发】线程与消息处理-实现多线程