Skip to content

Commit 41871d8

Browse files
committed
Add construct binary tree from preorder and inorder
1 parent af5371a commit 41871d8

File tree

2 files changed

+145
-1
lines changed

2 files changed

+145
-1
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ Algorithms [Part 1](https://www.coursera.org/learn/algorithms-part1/) and [Part2
8484
| Level Order Of Tree | [link](https://leetcode.com/explore/interview/card/top-interview-questions-easy/94/trees/628/) | ? | [Using queue](sites/leetcode/BinaryTreeTraversals.cpp) |
8585
| Sorted Array to Binary Search Tree | [link](https://leetcode.com/explore/interview/card/top-interview-questions-easy/94/trees/631/) | ? | [Recursive](sites/leetcode/SortedArratToBST.cpp) |
8686
| Inorder traversal| [link](https://leetcode.com/explore/interview/card/top-interview-questions-medium/108/trees-and-graphs/786/) | ? | [Iterative using stack](sites/leetcode/BinaryTreeTraversals.cpp) <br\> [Recursive](sites/leetcode/BinaryTreeTraversals.cpp) |
87-
| Zigzag/spiral level order traversal| [https://leetcode.com/explore/interview/card/top-interview-questions-medium/108/trees-and-graphs/787/]() | ? | [Link](sites/leetcode/BinaryTreeTraversals.cpp) |
87+
| Zigzag/spiral level order traversal| [link](https://leetcode.com/explore/interview/card/top-interview-questions-medium/108/trees-and-graphs/787/) | ? | [Link](sites/leetcode/BinaryTreeTraversals.cpp) |
88+
| Construct Binary Tree from Preorder and Inorder Traversal | [Link](https://leetcode.com/explore/interview/card/top-interview-questions-medium/108/trees-and-graphs/788/) | ? | [Link](sites/leetcode/ConstructBinaryTree.cpp) |
8889
| | []() | ? | []() |
8990

9091
## [Google CodeJam](sites/googlecodejam/README.md)
+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
// Construct Binary Tree from Preorder and Inorder Traversal
2+
// https://leetcode.com/explore/interview/card/top-interview-questions-medium/108/trees-and-graphs/788/
3+
4+
#include <iostream>
5+
#include <unordered_map>
6+
#include <vector>
7+
8+
struct Node
9+
{
10+
public:
11+
int key;
12+
Node* left;
13+
Node* right;
14+
15+
Node() : key{0}, left{nullptr}, right{right} { }
16+
Node(int k) : key{k}, left{nullptr}, right{nullptr} { }
17+
};
18+
19+
class Tree
20+
{
21+
private:
22+
Node* root;
23+
void destroyTree(Node* node);
24+
void inorder(Node* node, std::vector<int>& traversal);
25+
void preorder(Node* node, std::vector<int>& traversal);
26+
Node* constructTree(std::vector<int>& inorder, std::vector<int>& preorder,
27+
int start, int end, int& index, std::unordered_map<int,int>& indexMap);
28+
29+
public:
30+
Tree();
31+
~Tree();
32+
std::vector<int> inorder();
33+
std::vector<int> preorder();
34+
void constructTree(std::vector<int>& inorder, std::vector<int>& preorder);
35+
};
36+
37+
Tree::Tree() : root{nullptr} { }
38+
39+
Tree::~Tree()
40+
{
41+
if (root == nullptr) {
42+
return;
43+
}
44+
destroyTree(root);
45+
}
46+
47+
void Tree::destroyTree(Node* node)
48+
{
49+
if (node != nullptr) {
50+
destroyTree(node->left);
51+
destroyTree(node->right);
52+
delete node;
53+
}
54+
}
55+
56+
void Tree::inorder(Node* node, std::vector<int>& traversal)
57+
{
58+
if (node == nullptr) {
59+
return;
60+
}
61+
inorder(node->left, traversal);
62+
traversal.push_back(node->key);
63+
inorder(node->right, traversal);
64+
}
65+
66+
void Tree::preorder(Node* node, std::vector<int>& traversal)
67+
{
68+
if (node == nullptr) {
69+
return;
70+
}
71+
traversal.push_back(node->key);
72+
preorder(node->left, traversal);
73+
preorder(node->right, traversal);
74+
}
75+
76+
std::vector<int> Tree::inorder()
77+
{
78+
std::vector<int> traversal;
79+
inorder(root, traversal);
80+
return traversal;
81+
}
82+
83+
std::vector<int> Tree::preorder()
84+
{
85+
std::vector<int> traversal;
86+
preorder(root, traversal);
87+
return traversal;
88+
}
89+
90+
Node* Tree::constructTree(std::vector<int>& inorder, std::vector<int>& preorder,
91+
int start, int end, int& index, std::unordered_map<int,int>& indexMap)
92+
{
93+
if (start > end) {
94+
return nullptr;
95+
}
96+
97+
Node* node = new Node(preorder[index++]);
98+
int iIndex = indexMap[node->key];
99+
node->left = constructTree(inorder, preorder, start, iIndex - 1, index, indexMap);
100+
node->right = constructTree(inorder, preorder, iIndex + 1, end, index, indexMap);
101+
102+
return node;
103+
}
104+
105+
void Tree::constructTree(std::vector<int>& inorder, std::vector<int>& preorder)
106+
{
107+
std::unordered_map<int,int> indexMap;
108+
for (int i = 0; i < inorder.size(); ++i) {
109+
indexMap[inorder[i]] = i;
110+
}
111+
112+
int index = 0;
113+
root = constructTree(inorder, preorder, 0, static_cast<int>(inorder.size()) - 1, index, indexMap);
114+
}
115+
116+
void printVector(std::vector<int>& vec)
117+
{
118+
for (auto i : vec) {
119+
std::cout << i << " ";
120+
}
121+
std::cout << "\n";
122+
}
123+
124+
int main()
125+
{
126+
std::vector<int> preorder {3,9,20,15,7};
127+
std::vector<int> inorder {9,3,15,20,7};
128+
129+
Tree tree;
130+
tree.constructTree(inorder, preorder);
131+
132+
std::cout << "================================\n";
133+
std::vector<int> preTraversal = tree.preorder();
134+
std::cout << "Preorder traversal : ";
135+
printVector(preTraversal);
136+
137+
std::cout << "================================\n";
138+
std::vector<int> inTraversal = tree.inorder();
139+
std::cout << "Inorder traversal : ";
140+
printVector(inTraversal);
141+
142+
return 0;
143+
}

0 commit comments

Comments
 (0)