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 };
  • 相关阅读:
    远程桌面工具mRemoteNG与Tsmmc
    敏感性Sensitivity和特异性Specificity的说明
    React教程:4 个 useState Hook 示例
    React Hooks究竟是什么呢?
    一步一步搭建前端监控系统:如何监控资源加载错误?
    Promise的三兄弟:all(), race()以及allSettled()
    JavaScript中this究竟指向什么?
    编译器与Debug的传奇:Grace Murray Hopper小传
    21个React开发神器
    8种常见数据结构及其Javascript实现
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4548014.html
Copyright © 2011-2022 走看看