1 #include <vector>
2 #include <stack>
3 using std::vector;
4
5 struct TreeNode {
6 int val;
7 TreeNode* left;
8 TreeNode* right;
9 TreeNode(int x) :
10 val(x), left(nullptr), right(nullptr) {
11 }
12 };
13
14 vector<int> preOrder(TreeNode* root) {
15 vector<int> res;
16 if (root == nullptr)
17 return res;
18
19 std::stack<TreeNode*> s;
20 TreeNode* p = root;
21 while (p || !s.empty()) {
22 while (p) {
23 res.push_back(p->val);
24 s.push(p);
25 p = p->left;
26 }
27
28 if (!s.empty()) {
29 p = s.top();
30 s.pop();
31 p = p->right;
32 }
33 }
34 return res;
35 }
36
37 vector<int> inOrder(TreeNode* root) {
38 vector<int> res;
39 if (root == nullptr)
40 return res;
41 TreeNode* p = root;
42 std::stack<TreeNode*> s;
43
44 while (p || !s.empty()) {
45
46 while (p) {
47 s.push(p);
48 p = p->left;
49 }
50
51 if (!s.empty()) {
52 p = s.top();
53 s.pop();
54 res.push_back(p->val);
55 p = p->right;
56 }
57 }
58 return res;
59 }
60
61 vector<int> postorderTraversal(TreeNode* root) {
62 vector<int> res;
63 if (root == nullptr)
64 return res;
65
66 std::stack<TreeNode*> s;
67 TreeNode* cur = root;
68 TreeNode* pre = nullptr;
69
70 while (cur) {
71 s.push(cur);
72 cur = cur->left;
73 }
74
75 while (!s.empty()) {
76 cur = s.top();
77 s.pop();
78 if (cur->right == nullptr || cur->right == pre) {
79 res.push_back(cur->val);
80 pre = cur;
81 } else {
82 s.push(cur);
83 cur = cur->right;
84 while (cur) {
85 s.push(cur);
86 cur = cur->left;
87 }
88 }
89 }
90 return res;
91 }