zoukankan      html  css  js  c++  java
  • LeetCode 145. 二叉树的后序遍历

    地址 https://www.acwing.com/solution/content/21571/

    给定一个二叉树,返回它的 后序 遍历。
    
    示例:
    
    输入: [1,null,2,3]  
       1
        
         2
        /
       3 
    
    输出: [3,2,1]
    进阶: 递归算法很简单,你可以通过迭代算法完成吗?

    算法1
    简洁的递归写法

    C++ 代码

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : 
    *   val(x), left(left), right(right) {} * };
    */ class Solution { public: vector<int> v; void dfs(TreeNode* root) { if (root == NULL) return; dfs(root->left); dfs(root->right); v.push_back(root->val); } vector<int> postorderTraversal(TreeNode* root) { dfs(root); return v; } };

    算法2
    使用栈的迭代写法
    由于栈是先进后出
    所以先进根节点 再进左右子节点
    出栈的时候要注意 只有左右子节点都出栈了才能出栈
    所以加了一个map做记录方便速查

    C++ 代码

    class Solution {
      public:
          map<TreeNode*, int> flag;
          stack< TreeNode*> st;
          vector<int> v;
          vector<int> postorderTraversal(TreeNode* root) {
             // memset(flag, 0, sizeof flag);
              if (root == NULL)return v;
              st.push(root);
              flag[root] = 1;
              while (st.size()) {
                  TreeNode* p = st.top();
                  int noNext = 1;
    
                  if (p->right != NULL && flag[p->right ] == 0) {
                      st.push(p->right);
                      flag[p->right ] = 1;
                      noNext = 0;
                  }
                  if (p->left != NULL && flag[p->left ] == 0) {
                      st.push(p->left);
                      flag[p->left ] = 1;
                      noNext = 0;
                  }
    
                  if (noNext == 1) {
                      v.push_back(p->val);
                      st.pop();
                  }
              }
    
              return v;
          }
      };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    读库存扣减系列文章有感
    为什么不要将spring-boot相关依赖打入二方包
    volatile的特性代码验证
    谈谈JVM(基础模型)
    谈String,StringBuilder,StringBuffer随笔
    maven 安装
    Mysql中常用的函数
    web网页打印的方法(浏览器通用)
    web网页打印的方法
    代理服务器的用途
  • 原文地址:https://www.cnblogs.com/itdef/p/13749188.html
Copyright © 2011-2022 走看看