• [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 };
  • 相关阅读:
    【Oracle】修改oracle数据库的字符集
    【OS_Linux】Centos7 设置定时任务
    【 DB_Oracle】Oracle多表关联更新
    Java后端技术路线
    【 OS_Linux】centos下查找jdk的安装路径
    【实用工具】Notepad++的主题和字体设置
    【OS_Linux】Linux删除指定日期之前的文件
    【OS_Windows】windows下删除指定日期前的文件
    C#计算一段程序运行时间的三种方法
    Win10 新功能 改变显示器色彩
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4548014.html
Copyright © 2020-2023  润新知