recover-a-tree-from-preorder-traversal
1.0.0
Recover a Tree From Preorder Traversal
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1
#include <bits/stdc++.h>
2
3
using namespace
std;
4
5
struct
TreeNode
6
{
7
int
val
;
8
TreeNode
*
left
;
9
TreeNode
*
right
;
10
TreeNode
() :
val
(0),
left
(nullptr),
right
(nullptr) {}
11
TreeNode
(
int
x) :
val
(x),
left
(nullptr),
right
(nullptr) {}
12
TreeNode
(
int
x,
TreeNode
*
left
,
TreeNode
*
right
) :
val
(x),
left
(
left
),
right
(
right
) {}
13
};
14
15
class
Solution
16
{
17
public
:
18
TreeNode
*
recoverFromPreorder
(
string
traversal)
19
{
20
// (node, level)
21
stack<pair<TreeNode*, int>> st;
22
int
i = 0;
23
24
// interate through traversal string
25
while
(i < (
int
)traversal.size())
26
{
27
int
level = 0;
28
29
// count the dashes to determine current level
30
while
(i < (
int
)traversal.size() && traversal[i] ==
'-'
)
31
{
32
level++;
33
i++;
34
}
35
36
int
value = 0;
37
38
// parse numeric value of current node
39
while
(i < (
int
)traversal.size() && isdigit(traversal[i]))
40
{
41
value = value * 10 + (traversal[i] -
'0'
);
42
i++;
43
}
44
45
// allocate new node
46
TreeNode
* node =
new
TreeNode
(value);
47
while
(!st.empty() && st.top().second >= level)
48
st.pop();
49
50
// attach node to proper place using stack
51
if
(!st.empty())
52
{
53
if
(!st.top().first->left)
54
st.top().first->left = node;
55
else
56
st.top().first->
right
= node;
57
}
58
59
// push new node to the top of the stack
60
st.push({node, level});
61
}
62
63
// drop all elements of the stack to uncover the root
64
while
((
int
)st.size() > 1)
65
st.pop();
66
return
st.top().first;
67
}
68
};
69
70
void
bfs_print
(
TreeNode
* root)
71
{
72
if
(!root)
73
return
;
74
queue<TreeNode*> q;
75
q.push(root);
76
cout <<
"["
;
77
while
(!q.empty())
78
{
79
TreeNode
* t = q.front();
80
q.pop();
81
cout << t->
val
<<
", "
;
82
if
(t->
left
)
83
q.push(t->
left
);
84
if
(t->
right
)
85
q.push(t->
right
);
86
}
87
cout <<
"]\n"
;
88
}
89
90
void
delete_tree
(
TreeNode
* root)
91
{
92
if
(root)
93
{
94
if
(root->
left
)
95
delete_tree
(root->
left
);
96
if
(root->
right
)
97
delete_tree
(root->
right
);
98
delete
root;
99
}
100
}
101
102
int
main
()
103
{
104
string
traversal(
"1-2--3--4-5--6--7"
);
105
TreeNode
* tree =
Solution
().
recoverFromPreorder
(traversal);
106
bfs_print
(tree);
107
delete_tree
(tree);
108
return
0;
109
}
Solution
Definition
main.cpp:16
Solution::recoverFromPreorder
TreeNode * recoverFromPreorder(string traversal)
Definition
main.cpp:18
bfs_print
void bfs_print(TreeNode *root)
Definition
main.cpp:70
delete_tree
void delete_tree(TreeNode *root)
Definition
main.cpp:90
main
int main()
Definition
main.cpp:102
TreeNode
Definition
main.cpp:6
TreeNode::val
int val
Definition
main.cpp:7
TreeNode::left
TreeNode * left
Definition
main.cpp:8
TreeNode::TreeNode
TreeNode(int x, TreeNode *left, TreeNode *right)
Definition
main.cpp:12
TreeNode::right
TreeNode * right
Definition
main.cpp:9
TreeNode::TreeNode
TreeNode(int x)
Definition
main.cpp:11
TreeNode::TreeNode
TreeNode()
Definition
main.cpp:10
main.cpp
Generated by
1.9.8