_莫相逢

导航

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 };

 

posted on 2019-04-19 20:25  莫晓风  阅读(246)  评论(0编辑  收藏  举报