• LeetCode


    Binary Tree Postorder Traversal

    2014.1.14 21:17

    Given a binary tree, return the postorder traversal of its nodes' values.

    For example:
    Given binary tree {1,#,2,3},

       1
        
         2
        /
       3

    return [3,2,1].

    Note: Recursive solution is trivial, could you do it iteratively?

    Solution1:

      Recursive solution is trivial, here is the trivial code.

      Time and space complexities are both O(n) scale.

    Accepted code:

     1 // 1AC, the trivial recursive version.
     2 class Solution {
     3 public:
     4     vector<int> postorderTraversal(TreeNode *root) {
     5         result.clear();
     6         
     7         if(root == nullptr){
     8             return result;
     9         }
    10         
    11         preorderTraversalRecursive(root);
    12         
    13         return result;
    14     }
    15 private:
    16     void preorderTraversalRecursive(TreeNode *root) {
    17         if(root == nullptr){
    18             return;
    19         }
    20         preorderTraversalRecursive(root->left);
    21         preorderTraversalRecursive(root->right);
    22         result.push_back(root->val);
    23     }
    24     vector<int> result;
    25 };

    Solution2:

      Here is the iterative version. Two extra stacks are used to track the traversal. One used to record TreeNode pointer, the other used to record its counting. The counting here has the following meaning:

        0: the node has just been pushed into stack. The node is new.

        1: the left child of the node is in stack.

        2: the right child of the node is in stack. The node will be popped out when it is on top of stack.

      Time and space complexites are still O(n).

    Accepted code:

     1 // 2WA, 1AC, should've think more before starting coding
     2 class Solution {
     3 public:
     4     vector<int> postorderTraversal(TreeNode *root) {
     5         result.clear();
     6         
     7         if(root == nullptr){
     8             return result;
     9         }
    10         
    11         vstack.clear();
    12         cstack.clear();
    13         vstack.push_back(root);
    14         cstack.push_back(0);
    15         while(vstack.size() > 0){
    16             if(cstack[cstack.size() - 1] == 0){
    17                 ++cstack[cstack.size() - 1];
    18                 if(vstack[vstack.size() - 1]->left != nullptr){
    19                     cstack.push_back(0);
    20                     vstack.push_back(vstack[vstack.size() - 1]->left);
    21                 }
    22             }else if(cstack[cstack.size() - 1] == 1){
    23                 ++cstack[cstack.size() - 1];
    24                 if(vstack[vstack.size() - 1]->right != nullptr){
    25                     cstack.push_back(0);
    26                     vstack.push_back(vstack[vstack.size() - 1]->right);
    27                     // 1WA here, cannot push result here
    28                     // result.push_back(vstack[vstack.size() - 1]->val);
    29                     // 1WA here, cannot replace node here, this works for preorder, but not postorder
    30                     // vstack[vstack.size() - 1] = vstack[vstack.size() - 1]->right;
    31                 }
    32             }else{
    33                 result.push_back(vstack[vstack.size() - 1]->val);
    34                 cstack.pop_back();
    35                 vstack.pop_back();
    36             }
    37         }
    38         
    39         return result;
    40     }
    41 private:
    42     vector<int> result;
    43     vector<TreeNode *> vstack;
    44     vector<int> cstack;
    45 };
  • 相关阅读:
    人生苦短我学Java-1-Helloword
    python-51-MySQLdb查询返回dict格式
    IDEA/PyCharm等系列-会了这些设置编码舒服而效率又提高了一截
    jacoco-2-jenkins集成代码测试覆盖率
    jacoco-1-java代码测试覆盖率之本地环境初体验
    wordpress 安装提示 Error Establishing a Database Connection
    mysql 8.0 重置 root 账户密码
    Ubuntu 20.04 卸载 snapd
    VSCode 扩展选择快捷键插件 Quick and Simple Text Selection
    Swagger 响应数据 response 里包含动态变化的对象 key 的方法
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3519809.html
Copyright © 2020-2023  润新知