The recursive solution is trivial and I omit it here.

Iterative Solution using Stack (O(n) time and O(n) space):

 /**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root: The root of binary tree.
* @return: Inorder in vector which contains node values.
*/
public:
vector<int> inorderTraversal(TreeNode *root) {
// write your code here
vector<int> nodes;
TreeNode* node = root;
stack<TreeNode*> toVisit;
while (node || !toVisit.empty()) {
if (node) {
toVisit.push(node);
node = node -> left;
}
else {
node = toVisit.top();
toVisit.pop();
nodes.push_back(node -> val);
node = node -> right;
}
}
return nodes;
}
};

Another more sophisticated soltuion using Morris Traversal (O(n) time and O(1) space):

 /**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root: The root of binary tree.
* @return: Inorder in vector which contains node values.
*/
public:
vector<int> inorderTraversal(TreeNode *root) {
// write your code here
vector<int> nodes;
TreeNode* node = root;
while (node) {
if (node -> left) {
TreeNode* predecessor = node -> left;
while (predecessor -> right && predecessor -> right != node)
predecessor = predecessor -> right;
if (!(predecessor -> right)) {
predecessor -> right = node;
node = node -> left;
}
else {
predecessor -> right = NULL;
nodes.push_back(node -> val);
node = node -> right;
}
}
else {
nodes.push_back(node -> val);
node = node -> right;
}
}
return nodes;
}
};

最新文章

  1. IO流基本操作
  2. js 验证用户名和密码是否为空
  3. Python学习笔记——Day1
  4. jsckson,想说爱你不容易啊。。。406错误
  5. MyCat 学习笔记 第八篇.数据分片 之 求摸运算分片
  6. poj 2312 Battle City
  7. 用C++ 设计一个不能被继承的类
  8. asp.net Handler中的IsReusable属性及在Handler中使用Session
  9. 学习笔记 一步步了解webpack
  10. Spark学习之Spark Streaming
  11. cdh集群认证命令
  12. 时序扩展的UML状态图的测试用例生成研究
  13. flask 定义数据库关系(一对一)
  14. JavaScript学习(一)
  15. 使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题(转http://blog.csdn.net/slimboy123/article/details/4366701)
  16. QT5下的caffe项目属性
  17. 单字段去重 distinct 返回其他多个字段
  18. 批量删除进程清理 minerd
  19. Python实现创建字典
  20. ImportError: No module named Crypto.PublicKey

热门文章

  1. hybird和js交互退出
  2. Lintcode---单词的添加与查找
  3. 点滴积累【JS】---JS小功能(button选择颜色)
  4. 开启ss-libev多用户
  5. numpy.meshgrid()理解
  6. HTTP Range header
  7. Linux_Command
  8. 逻辑漏洞-客户端验证的邮箱-Web渗透实例之中国教育部青少年普法网站逻辑漏洞
  9. maven+nexus setting.xml配置(收藏)
  10. 在Ubuntu中安装mongodb