每日leetcode-145

二叉树的后序遍历。

两个栈方式的

直接看http://www.bilibili.com/video/av23885544/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
if (!root) {
return ans;
}
stack<TreeNode*> nodes;
stack<bool> tag;
nodes.push(root);
tag.push(false); // 标记应不应该访问nodes的第一个元素
TreeNode* p = root->left;
while (p || !nodes.empty()) {
if (p) {
nodes.push(p);
tag.push(false);
p = p->left;
}
else {
if (tag.top()) {
// 这个时候已经访问了nodes这个stack里面第一个节点的左右子树了,所以需要访问nodes这个节点,之后就pop出来,继续访问他的上面没有访问的节点或者右子树
tag.pop();
auto a = nodes.top();
ans.push_back(a->val);
nodes.pop();
}
else {
tag.pop();
tag.push(true);
p = nodes.top()->right; // 这时候要访问右子树了!
}
}
}
return ans;
}
};

前序遍历改一下

前序遍历的时候,把左右子树进栈的顺序反一下,得到的结果就是后序遍历的反向。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
if (!root) {
return ans;
}
stack<TreeNode*> nodes;
nodes.push(root);
while (!nodes.empty()) {
auto a = nodes.top();
nodes.pop();
if (a) {
ans.insert(ans.begin(), a->val);
nodes.push(a->left);
nodes.push(a->right);
}
}
return ans;
}
};