• Binary Tree Inorder Traversal


    Given a binary tree, return the inorder traversal of its nodes' values.
    For example:
    Given binary tree {1,#,2,3},
    1

    2
    /
    3
    return [1,3,2].
    Note: Recursive solution is trivial, could you do it iteratively?

    Solution: 1. Iterative way (stack). Time: O(n), Space: O(n).
    2. Recursive solution. Time: O(n), Space: O(n).
    3. Threaded tree (Morris). Time: O(n), Space: O(1).

     1 class Solution {
     2 public:
     3     vector<int> inorderTraversal(TreeNode *root) {
     4         return inorderTraversal_1(root);
     5     }
     6     
     7     vector<int> inorderTraversal_1(TreeNode *root) {
     8         vector<int> res;
     9         stack<TreeNode *> stk;
    10         TreeNode *cur = root;
    11         while (cur || !stk.empty())
    12         {
    13             if (cur)
    14             {
    15                 stk.push(cur);
    16                 cur = cur->left;
    17             }
    18             else if (!stk.empty())
    19             {
    20                 res.push_back(stk.top()->val);
    21                 cur = stk.top()->right;
    22                 stk.pop();
    23             }
    24         }
    25         return res;
    26     }
    27     
    28     vector<int> inorderTraversal_2(TreeNode *root) {
    29         vector<int> res;
    30         inorderTraversalRe(root, res);
    31         return res;
    32     }
    33 
    34     void inorderTraversalRe(TreeNode *node, vector<int> &res) {
    35         if (!node) return;
    36         inorderTraversalRe(node->left, res);
    37         res.push_back(node->val);
    38         inorderTraversalRe(node->right, res);
    39     }
    40     
    41     vector<int> inorderTraversal_3(TreeNode *root) {
    42         vector<int> res;
    43         TreeNode *cur = root;
    44         while (cur)
    45         {
    46             if (cur->left)
    47             {
    48                 TreeNode *prev = cur->left;
    49                 while (prev->right && prev->right != cur)
    50                     prev = prev->right;
    51                     
    52                 if (prev->right == cur)
    53                 {
    54                     res.push_back(cur->val);
    55                     cur = cur->right;
    56                     prev->right = NULL;
    57                 }
    58                 else
    59                 {
    60                     prev->right = cur;
    61                     cur = cur->left;
    62                 }
    63             }
    64             else
    65             {
    66                 res.push_back(cur->val);
    67                 cur = cur->right;
    68             }
    69         }
    70         return res;
    71     }
    72 };
  • 相关阅读:
    js、css引用文件的下载方式
    前端参考
    Mac配置
    chrome devtools调试Android Webview再也不FQ了!URL映射 + appspot devtools镜像解决chrome调试安卓前端HTML5页面时白屏的问题
    MyBatis 日志输出
    MyBatis 简单原理介绍
    MyBatis resultType 的使用
    sql必知必会笔记
    MyBatis基础:使用java提供的ThreadLocal类优化代码
    Mybatis基础(2)
  • 原文地址:https://www.cnblogs.com/zhengjiankang/p/3647897.html
Copyright © 2020-2023  润新知