summaryrefslogtreecommitdiff
path: root/top-interview-questions/easy/trees
diff options
context:
space:
mode:
Diffstat (limited to 'top-interview-questions/easy/trees')
-rw-r--r--top-interview-questions/easy/trees/01_maximum_depth_of_binary_tree.cc20
-rw-r--r--top-interview-questions/easy/trees/02_valid_binary_search_tree.cc54
-rw-r--r--top-interview-questions/easy/trees/03_symmetric_tree.cc52
-rw-r--r--top-interview-questions/easy/trees/04_binary_tree_level_order_traversal.cc44
-rw-r--r--top-interview-questions/easy/trees/05_convert_sorted_array_to_binary_search_tree.cc27
5 files changed, 197 insertions, 0 deletions
diff --git a/top-interview-questions/easy/trees/01_maximum_depth_of_binary_tree.cc b/top-interview-questions/easy/trees/01_maximum_depth_of_binary_tree.cc
new file mode 100644
index 0000000..4d13af7
--- /dev/null
+++ b/top-interview-questions/easy/trees/01_maximum_depth_of_binary_tree.cc
@@ -0,0 +1,20 @@
1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode() : val(0), left(nullptr), right(nullptr) {}
8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10 * };
11 */
12class Solution {
13public:
14 int max(int a, int b) { return a > b ? a : b; }
15
16 int maxDepth(TreeNode* root) {
17 if (!root) return 0;
18 return 1 + max(maxDepth(root->left), maxDepth(root->right));
19 }
20};
diff --git a/top-interview-questions/easy/trees/02_valid_binary_search_tree.cc b/top-interview-questions/easy/trees/02_valid_binary_search_tree.cc
new file mode 100644
index 0000000..a071daf
--- /dev/null
+++ b/top-interview-questions/easy/trees/02_valid_binary_search_tree.cc
@@ -0,0 +1,54 @@
1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode() : val(0), left(nullptr), right(nullptr) {}
8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10 * };
11 */
12class Solution {
13public:
14 bool isValidBSTRec(TreeNode* root, int* min, int* max) {
15 if (root->left && root->right) {
16 int leftMin, leftMax, rightMin, rightMax;
17 if (!isValidBSTRec(root->left, &leftMin, &leftMax) ||
18 !isValidBSTRec(root->right, &rightMin, &rightMax)) {
19 return false;
20 }
21 *min = std::min(std::min(leftMin, rightMin), root->val);
22 *max = std::max(std::max(leftMax, rightMax), root->val);
23 return (leftMax < root->val) && (root->val < rightMin);
24 }
25 else if (root->left) {
26 int leftMin, leftMax;
27 if (!isValidBSTRec(root->left, &leftMin, &leftMax)) {
28 return false;
29 }
30 *min = std::min(leftMin, root->val);
31 *max = std::max(leftMax, root->val);
32 return (leftMax < root->val);
33 }
34 else if (root->right) {
35 int rightMin, rightMax;
36 if (!isValidBSTRec(root->right, &rightMin, &rightMax)) {
37 return false;
38 }
39 *min = std::min(rightMin, root->val);
40 *max = std::max(rightMax, root->val);
41 return (root->val < rightMin);
42 }
43 else {
44 *min = *max = root->val;
45 return true;
46 }
47 }
48
49 bool isValidBST(TreeNode* root) {
50 if (!root) return true;
51 int minVal, maxVal;
52 return isValidBSTRec(root, &minVal, &maxVal);
53 }
54};
diff --git a/top-interview-questions/easy/trees/03_symmetric_tree.cc b/top-interview-questions/easy/trees/03_symmetric_tree.cc
new file mode 100644
index 0000000..bbdc52b
--- /dev/null
+++ b/top-interview-questions/easy/trees/03_symmetric_tree.cc
@@ -0,0 +1,52 @@
1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode() : val(0), left(nullptr), right(nullptr) {}
8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10 * };
11 */
12class Solution {
13public:
14 bool isSymmetricVector(const std::vector<const TreeNode*>& nodes) {
15 if (nodes.empty()) return true;
16 if (nodes.size() == 1) return true;
17 for (size_t i = 0; i < nodes.size()/2; ++i) {
18 const size_t j = nodes.size() - i - 1;
19 if ((nodes[i] && !nodes[j]) ||
20 (!nodes[i] && nodes[j]) ||
21 (nodes[i] && nodes[j] && (nodes[i]->val != nodes[j]->val))) {
22 return false;
23 }
24 }
25 return true;
26 }
27
28 bool isSymmetricBfs(std::vector<const TreeNode*>& current_level,
29 std::vector<const TreeNode*>& next_level) {
30 if (current_level.empty()) {
31 return true;
32 }
33 if (!isSymmetricVector(current_level)) {
34 return false;
35 }
36 for (const TreeNode* node : current_level) {
37 if (node) {
38 next_level.push_back(node->left);
39 next_level.push_back(node->right);
40 }
41 }
42 current_level.clear(); // New next level.
43 return isSymmetricBfs(next_level, current_level);
44 }
45
46 bool isSymmetric(TreeNode* root) {
47 if (!root) return true;
48 std::vector<const TreeNode*> current_level({root});
49 std::vector<const TreeNode*> next_level;
50 return isSymmetricBfs(current_level, next_level);
51 }
52};
diff --git a/top-interview-questions/easy/trees/04_binary_tree_level_order_traversal.cc b/top-interview-questions/easy/trees/04_binary_tree_level_order_traversal.cc
new file mode 100644
index 0000000..9c506ab
--- /dev/null
+++ b/top-interview-questions/easy/trees/04_binary_tree_level_order_traversal.cc
@@ -0,0 +1,44 @@
1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode() : val(0), left(nullptr), right(nullptr) {}
8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10 * };
11 */
12class Solution {
13public:
14 void bfs(vector<vector<int>>& levels,
15 vector<const TreeNode*>& current_level,
16 vector<const TreeNode*>& next_level) {
17 if (current_level.empty()) {
18 return;
19 }
20 levels.push_back({});
21 vector<int>& level = levels.back();
22 level.reserve(current_level.size());
23 for (const TreeNode* node : current_level) {
24 level.push_back(node->val);
25 if (node->left) {
26 next_level.push_back(node->left);
27 }
28 if (node->right) {
29 next_level.push_back(node->right);
30 }
31 }
32 current_level.clear(); // New next level.
33 bfs(levels, next_level, current_level);
34 }
35
36 vector<vector<int>> levelOrder(TreeNode* root) {
37 if (!root) return {};
38 vector<vector<int>> levels;
39 vector<const TreeNode*> current_level({root});
40 vector<const TreeNode*> next_level;
41 bfs(levels, current_level, next_level);
42 return levels;
43 }
44};
diff --git a/top-interview-questions/easy/trees/05_convert_sorted_array_to_binary_search_tree.cc b/top-interview-questions/easy/trees/05_convert_sorted_array_to_binary_search_tree.cc
new file mode 100644
index 0000000..4882a2a
--- /dev/null
+++ b/top-interview-questions/easy/trees/05_convert_sorted_array_to_binary_search_tree.cc
@@ -0,0 +1,27 @@
1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode() : val(0), left(nullptr), right(nullptr) {}
8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10 * };
11 */
12class Solution {
13public:
14 // 'end' is one past the end.
15 TreeNode* makeTree(const vector<int>& nums, size_t start, size_t end) {
16 if (start >= end) return nullptr;
17 const size_t middle = start + (end - start) / 2;
18 TreeNode* root = new TreeNode(nums[middle]);
19 root->left = makeTree(nums, start, middle);
20 root->right = makeTree(nums, middle+1, end);
21 return root;
22 }
23
24 TreeNode* sortedArrayToBST(vector<int>& nums) {
25 return makeTree(nums, 0, nums.size());
26 }
27};