-
Notifications
You must be signed in to change notification settings - Fork 0
/
Binary_Tree_Postorder_Traversal.cpp
134 lines (129 loc) · 3.73 KB
/
Binary_Tree_Postorder_Traversal.cpp
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//////////////////////////////////////////////////////
// Project: MyLeetCode
//
// Author: YanShicong
// Date: 2014/11/26
//////////////////////////////////////////////////////
/*--------------------------------------------------------------------------------------------------------------
* Given a binary tree, return the postorder traversal of its nodes' values.
*
* For example:
* Given binary tree {1,#,2,3},
* 1
* \
* 2
* /
* 3
* return [3,2,1].
*
* Note: Recursive solution is trivial, could you do it iteratively?
//--------------------------------------------------------------------------------------------------------------*/
#include "../include/include.h"
// 时间复杂度O(n),空间复杂度O(n)
// 有左节点时持续访问左结点,并将父节点入栈。
// 当没有左节点时,取出栈顶一个元素,如果其右节点已被访问,访问该栈顶元素。
// 如果右节点未被访问,栈顶元素重新入栈。从其右节点开始重复进行上述过程。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
#define W2
#ifdef W1
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> result;
const TreeNode *p, *q;
stack<const TreeNode *> s;
p = root;
do {
while (p != NULL)
{
s.push(p);
p = p->left; // 往左下走
}
q = NULL;
while (!s.empty())
{
p = s.top();
s.pop();
// 右孩子不存在或已被访问,访问之
if (p->right == q)
{
result.push_back(p->val);
q = p; // 保存刚访问过的结点
}else
{
s.push(p); // 当前结点不能访问,需二次进栈
p = p->right; // 处理右子树
break; // 重新开始循环,以从此节点开始,重新左下等等那一轮
}
}
}while (!s.empty());
return result;
}
};
#endif
#ifdef W2
/**
* 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> result;
if (!root)
return result;
TreeNode* last_visited = nullptr;
stack<TreeNode*> st;
TreeNode* p = root;
while (!st.empty() || p) {
if (p) {
st.push(p);
p = p->left;
} else {
p = st.top();
if (p->right == nullptr || last_visited == p->right) {
result.push_back(p->val);
last_visited = p;
st.pop();
p = nullptr;
} else {
p = p->right;
}
}
}
return result;
}
};
#endif
//--------------------------------------------------------------------------------------------------------------
TEST_CASE("Binary_Tree_Postorder_Traversal", "[Tree_Traverse]"){
Solution sln;
vector<int> result;
SECTION("Empty Input") {
REQUIRE(sln.postorderTraversal(NULL) == result);
}
SECTION("Normal Input") {
TreeNode t1(1);
TreeNode t2(2);
TreeNode t3(3);
t1.right = &t2;
t2.left = &t3;
int r[3] = {3,2,1};
result.assign(r,r+3);
REQUIRE(sln.postorderTraversal(&t1) == result);
}
}