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 };
  • 相关阅读:
    AC自动机(转载)
    hdu 4352 XHXJ's LIS(数位dp+状压)
    hdu 4734 F(x)(数位dp)
    hdu 3709 Balanced Number(数位dp)
    hdu 6268 Master of Subgraph(点分治+bitset)
    poj 1741 tree(点分治)
    pytorch 矩阵数据增加维度unsqueeze和降低维度squeeze
    pytorch seq2seq模型中加入teacher_forcing机制
    pytorch seq2seq模型训练测试
    python os模块判断文件是否存在,file_path获取当前文件路径
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4548014.html
Copyright © 2011-2022 走看看