Skip to content

Commit 6d2429f

Browse files
author
kwu130
committed
feat(src): implement trees helper functions and add 94-inorderTraversal, 95-generateTrees
1 parent 0e02e70 commit 6d2429f

3 files changed

Lines changed: 187 additions & 0 deletions

File tree

‎include/common.h‎

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,67 @@ inline void free(ListNode* head) {
5959
}
6060
} // namespace listHelper
6161

62+
namespace treeHelper {
63+
struct TreeNode {
64+
int val;
65+
TreeNode* left;
66+
TreeNode* right;
67+
TreeNode()
68+
: val(0),
69+
left(nullptr),
70+
right(nullptr) {}
71+
explicit TreeNode(int x)
72+
: val(x),
73+
left(nullptr),
74+
right(nullptr) {}
75+
TreeNode(const int x, TreeNode* left, TreeNode* right)
76+
: val(x),
77+
left(left),
78+
right(right) {}
79+
};
80+
81+
inline TreeNode* build(const std::vector<int>& vec, int nullptr_val = -1) {
82+
if (vec.empty() || vec[0] == nullptr_val) return nullptr;
83+
84+
std::queue<TreeNode*> q;
85+
auto* root = new TreeNode(vec[0]);
86+
q.push(root);
87+
88+
size_t i = 1;
89+
while (!q.empty() && i < vec.size()) {
90+
TreeNode* cur = q.front();
91+
q.pop();
92+
93+
if (i < vec.size() && vec[i] != nullptr_val) {
94+
cur->left = new TreeNode(vec[i]);
95+
q.push(cur->left);
96+
}
97+
i++;
98+
99+
if (i < vec.size() && vec[i] != nullptr_val) {
100+
cur->right = new TreeNode(vec[i]);
101+
q.push(cur->right);
102+
}
103+
i++;
104+
}
105+
return root;
106+
}
107+
108+
inline bool equal(const TreeNode* a, const TreeNode* b) {
109+
if (a == nullptr && b == nullptr) return true;
110+
if (a == nullptr || b == nullptr) return false;
111+
if (a->val != b->val) return false;
112+
113+
return equal(a->left, b->left) && equal(a->right, b->right);
114+
}
115+
116+
inline void free(const TreeNode* root) {
117+
if (root == nullptr) return;
118+
free(root->left);
119+
free(root->right);
120+
delete root;
121+
}
122+
} // namespace treeHelper
62123

63124
namespace compareHelper {
64125
template <typename V>

‎src/94-inorderTraversal.cpp‎

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
//
2+
// Created by 1412 on 2025/11/23.
3+
//
4+
5+
#include <bits/stdc++.h>
6+
#include "common.h"
7+
8+
using namespace std;
9+
using treeHelper::TreeNode;
10+
11+
class Solution {
12+
public:
13+
vector<int> inorderTraversal(TreeNode* root) {
14+
vector<int> res;
15+
stack<TreeNode*> s;
16+
while (root != nullptr || !s.empty()) {
17+
while (root != nullptr) {
18+
s.push(root);
19+
root = root->left;
20+
}
21+
root = s.top();
22+
s.pop();
23+
res.push_back(root->val);
24+
root = root->right;
25+
}
26+
return res;
27+
}
28+
};
29+
30+
void test() {
31+
Solution s;
32+
int nullptr_val = -1;
33+
TreeNode* root = treeHelper::build({1, nullptr_val, 2, 3}, nullptr_val);
34+
vector<int> expected = {1, 3, 2};
35+
vector<int> res = s.inorderTraversal(root);
36+
assert(res == expected);
37+
treeHelper::free(root);
38+
39+
root = treeHelper::build({}, nullptr_val);
40+
expected = {};
41+
res = s.inorderTraversal(root);
42+
assert(res == expected);
43+
treeHelper::free(root);
44+
45+
root = treeHelper::build({1}, nullptr_val);
46+
expected = {1};
47+
res = s.inorderTraversal(root);
48+
assert(res == expected);
49+
treeHelper::free(root);
50+
}
51+
52+
int main() {
53+
test();
54+
return 0;
55+
}

‎src/95-generateTrees.cpp‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//
2+
// Created by 1412 on 2025/11/24.
3+
//
4+
5+
#include <bits/stdc++.h>
6+
#include "common.h"
7+
8+
using namespace std;
9+
using treeHelper::TreeNode;
10+
11+
class Solution {
12+
public:
13+
vector<TreeNode*> generateTrees(int n) {
14+
if (n == 0) {
15+
return {nullptr};
16+
}
17+
return generateTrees(1, n);
18+
}
19+
20+
private:
21+
vector<TreeNode*> generateTrees(int min, int max) {
22+
if (min > max) {
23+
return {nullptr};
24+
}
25+
vector<TreeNode*> res;
26+
for (int i = min; i <= max; i++) {
27+
auto left = generateTrees(min, i - 1);
28+
auto right = generateTrees(i + 1, max);
29+
for (auto l : left) {
30+
for (auto r : right) {
31+
TreeNode* root = new TreeNode(i);
32+
root->left = l;
33+
root->right = r;
34+
res.push_back(root);
35+
}
36+
}
37+
}
38+
return res;
39+
}
40+
};
41+
42+
void test() {
43+
Solution s;
44+
vector<TreeNode*> res = s.generateTrees(3);
45+
vector<TreeNode*> expected;
46+
int nullptr_val = -1;
47+
expected.push_back(treeHelper::build({1, nullptr_val, 2, nullptr_val, 3}, nullptr_val));
48+
expected.push_back(treeHelper::build({1, nullptr_val, 3, 2}, nullptr_val));
49+
expected.push_back(treeHelper::build({2, 1, 3}, nullptr_val));
50+
expected.push_back(treeHelper::build({3, 1, nullptr_val, nullptr_val, 2}, nullptr_val));
51+
expected.push_back(treeHelper::build({3, 2, nullptr_val, 1}, nullptr_val));
52+
for (size_t i = 0; i < res.size(); i++) {
53+
assert(treeHelper::equal(res[i], expected[i]));
54+
treeHelper::free(res[i]);
55+
treeHelper::free(expected[i]);
56+
}
57+
58+
res = s.generateTrees(1);
59+
expected.clear();
60+
expected.push_back(treeHelper::build({1}, nullptr_val));
61+
for (size_t i = 0; i < res.size(); i++) {
62+
assert(treeHelper::equal(res[i], expected[i]));
63+
treeHelper::free(res[i]);
64+
treeHelper::free(expected[i]);
65+
}
66+
}
67+
68+
int main() {
69+
test();
70+
return 0;
71+
}

0 commit comments

Comments
 (0)