zoukankan      html  css  js  c++  java
  • LeetCode 145 二叉树的后序遍历(非递归)

    题目:

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

    示例:

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

    进阶: 递归算法很简单,你可以通过迭代算法完成吗?

    解题思路:

    1、使用一个栈,先把二叉树的右孩子压入,再把左孩子压入。这样在输出时就满足后序要求(先左后右)。

    2、当某个节点的左孩子或者右孩子都为NULL时,可以访问。此外记录当前节点p的上一个节点last,因为当p的左右孩子都已访问过时,轮到p被访问,设置last可标志p的左右孩子是否都被访问过了。即为 if((p->right == NULL && p->left == last) || p->right == last) 

    代码:

     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 == NULL)
    15             return ans;
    16         TreeNode* p = root;
    17         TreeNode* last;
    18         stack<TreeNode*> s;
    19         s.push(p);
    20         while(!s.empty())
    21         {
    22             p = s.top();
    23             if((p->left == NULL && p->right == NULL) || (p->right == NULL && p->left == last) || p->right == last)
    24             {
    25                 ans.push_back(p->val);
    26                 last = p;
    27                 s.pop();
    28             }
    29             else
    30             {
    31                 if(p->right)
    32                     s.push(p->right);
    33                 if(p->left)
    34                     s.push(p->left);
    35             }
    36         }
    37         return ans;
    38     }
    39 };
  • 相关阅读:
    DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
    MySQL聚合函数、控制流程函数(含navicat软件的介绍)
    MySQL JDBC事务处理、封装JDBC工具类
    ResultSet详解(转)
    开源软件收集
    免费开源3D模型设计软件汇总
    oschina多媒体工具
    oschina文件传输
    简单工厂模式
    权限表的设计
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10738591.html
Copyright © 2011-2022 走看看