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
3using namespace std;
4
5struct TreeNode
6{
7 int val;
10 TreeNode() : val(0), left(nullptr), right(nullptr) {}
11 TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
13};
14
16{
17public:
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
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
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
102int 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}
TreeNode * recoverFromPreorder(string traversal)
Definition main.cpp:18
void bfs_print(TreeNode *root)
Definition main.cpp:70
void delete_tree(TreeNode *root)
Definition main.cpp:90
int main()
Definition main.cpp:102
int val
Definition main.cpp:7
TreeNode * left
Definition main.cpp:8
TreeNode(int x, TreeNode *left, TreeNode *right)
Definition main.cpp:12
TreeNode * right
Definition main.cpp:9
TreeNode(int x)
Definition main.cpp:11
TreeNode()
Definition main.cpp:10