-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0094.binary_tree_inorder_traversal_M.cpp
81 lines (79 loc) · 2.13 KB
/
0094.binary_tree_inorder_traversal_M.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
/**
* https://leetcode.com/problems/binary-tree-inorder-traversal/description/
* 2015/08
* 0 ms
*/
/**
* 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
{
private:
vector<int> seq;
stack<TreeNode *> l_nodes;
stack<TreeNode *> r_nodes;
stack<int> nodes;
public:
vector<int> inorderTraversal(TreeNode * root)
{
seq.clear();
while(! nodes.empty())
nodes.pop();
while(! l_nodes.empty())
l_nodes.pop();
while(! r_nodes.empty())
r_nodes.pop();
if(NULL == root)
return seq;
nodes.push(root -> val);
l_nodes.push(root -> left);
r_nodes.push(root -> right);
while(! (nodes.empty() && l_nodes.empty() && r_nodes.empty()))
{
while(! l_nodes.empty())
{
TreeNode * n = l_nodes.top();
l_nodes.pop();
if(n != NULL)
{
if(n -> left == NULL && n -> right == NULL)
seq.push_back(n -> val);
else
{
nodes.push(n -> val);
l_nodes.push(n -> left);
r_nodes.push(n -> right);
}
}
}
if(! nodes.empty())
{
seq.push_back(nodes.top());
nodes.pop();
}
if(! r_nodes.empty())
{
TreeNode * n = r_nodes.top();
r_nodes.pop();
if(n != NULL)
{
if(n -> left == NULL && n -> right == NULL)
seq.push_back(n -> val);
else
{
nodes.push(n -> val);
l_nodes.push(n -> left);
r_nodes.push(n -> right);
}
}
}
}
return seq;
}
};