• LeetCode 145. 二叉树的后序遍历


    给定一个二叉树,返回它的 后序 遍历。

    示例:

    输入: [1,null,2,3]
    1

    2
    /
    3

    输出: [3,2,1]
    进阶: 递归算法很简单,你可以通过迭代算法完成吗?

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal

    迭代:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<int> postorderTraversal(TreeNode* root) {
    13        vector<int> ans;
    14         if(!root) return ans;
    15         stack<TreeNode*> nodeStack1,nodeStack2;
    16         TreeNode* node;
    17         nodeStack1.push(root);
    18         while( !nodeStack1.empty())
    19         {
    20             node = nodeStack1.top();
    21             nodeStack1.pop();
    22             nodeStack2.push(node);
    23             if(node->left) 
    24                 nodeStack1.push(node->left);
    25             if(node->right)
    26                 nodeStack1.push(node->right);
    27         }
    28 
    29         while(!nodeStack2.empty())
    30         {
    31             ans.push_back(nodeStack2.top()->val);
    32             nodeStack2.pop();
    33         }
    34 
    35         return ans;
    36     }
    37 };

    优化:来源:

    class Solution {
    public:
        vector<int> postorderTraversal(TreeNode* root) {
            vector<int> ans;
            if(root == NULL){
                return ans;
            }
            
            stack<TreeNode*> q;
            TreeNode *p = root;
            TreeNode *pLast = NULL;
            while(p){
                q.push(p);
                p = p->left;
            }
            while(!q.empty()){
                p = q.top();
                q.pop();
                // 右无或者右看过,可以看中
                if(!p->right || p->right==pLast){
                    ans.push_back(p->val);
                    pLast = p;
                }else{
                    // 进入右
                    q.push(p);
                    p = p->right;
                    while(p){
                        q.push(p);
                        p = p->left;
                    }
                }
            }
            
            return ans;
        }
    };
  • 相关阅读:
    如何禁用事件的浮升(div的子元素的点击事件会触发父元素的点击事件)
    如何用Ajax加载服务器的图片
    MyBaits一对一的查询方法
    WEB编程中获取src目录下的文件(没有src目录)
    Vs code背景图
    JS正则表达式
    宏任务和微任务:setTimeout和Promise执行顺序
    MySql操作(一)
    Js 运行机制和Event Loop
    浅拷贝与深拷贝
  • 原文地址:https://www.cnblogs.com/jj81/p/11487437.html
Copyright © 2020-2023  润新知