zoukankan      html  css  js  c++  java
  • [LeetCode] Binary Tree Inorder Traversal

    This is a fundamental and yet classic problem. I share my three solutions here:

    1. Iterative solution using stack --- O(n) time and O(n) space;
    2. Recursive solution --- O(n) time and O(n) space (considering the costs of call stack);
    3. Morris traversal --- O(n) time and O(1) space!!!

    Iterative solution using stack:

     1 class Solution {
     2 public:
     3     vector<int> inorderTraversal(TreeNode* root) {
     4         vector<int> nodes;
     5         TreeNode* curNode = root;
     6         stack<TreeNode*> toVisit;
     7         while (curNode || !toVisit.empty()) {
     8             if (curNode) {
     9                 toVisit.push(curNode);
    10                 curNode = curNode -> left;
    11             }
    12             else {
    13                 curNode = toVisit.top();
    14                 toVisit.pop();
    15                 nodes.push_back(curNode -> val);
    16                 curNode = curNode -> right;
    17             }
    18         }
    19         return nodes;
    20     }
    21 }; 

    Recursive solution:

     1 class Solution {
     2 public:
     3     void inorder(TreeNode* node, vector<int>& nodes) {
     4         if (!node) return;
     5         inorder(node -> left, nodes);
     6         nodes.push_back(node -> val);
     7         inorder(node -> right, nodes);
     8     }
     9     vector<int> inorderTraversal(TreeNode* root) {
    10         vector<int> nodes;
    11         inorder(root, nodes);
    12         return nodes;
    13     }
    14 }; 

    Morris traversal:

     1 class Solution {
     2 public:
     3     vector<int> inorderTraversal(TreeNode* root) {
     4         vector<int> nodes;
     5         TreeNode* curNode = root;
     6         while (curNode) {
     7             if (curNode -> left) {
     8                 TreeNode* predecessor = curNode -> left;
     9                 while (predecessor -> right && predecessor -> right != curNode)
    10                     predecessor = predecessor -> right;
    11                 if (predecessor -> right == NULL) {
    12                     predecessor -> right = curNode;
    13                     curNode = curNode -> left;
    14                 }
    15                 else {
    16                     predecessor -> right = NULL;
    17                     nodes.push_back(curNode -> val);
    18                     curNode = curNode -> right;
    19                 }
    20             }
    21             else {
    22                 nodes.push_back(curNode -> val);
    23                 curNode = curNode -> right;
    24             }
    25         }
    26         return nodes;
    27     }
    28 };
  • 相关阅读:
    windows 开发 数据模版 Itemtemp
    windows 8 获取用户账号信息
    从客户端中检测到有潜在危险的 Request.Form 值解决方法
    asp.net异步处理
    知道web.config 中的 urlMappings怎么用?
    .net c#日期时间函数大全
    设计模式学习心得之工厂类模式(一)简单工厂模式
    远程网页内容抓取
    TreeView数据绑定的方法(1)
    URLRewriter.dll asp.net伪静态
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4548014.html
Copyright © 2011-2022 走看看