Skip to content

Commit c58ce71

Browse files
author
kwu130
committed
feat(src): add 113-pathSum, 114-flatten, 116-connect, 117-connect.cpp src
1 parent 29aaaae commit c58ce71

4 files changed

Lines changed: 359 additions & 0 deletions

File tree

‎src/113-pathSum.cpp‎

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
//
2+
// Created by 1412 on 2025/12/9.
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<vector<int>> pathSum(TreeNode* root, int targetSum) {
14+
vector<vector<int>> res;
15+
if (root == nullptr) return res;
16+
dfs(root, targetSum, res, {});
17+
return res;
18+
}
19+
20+
private:
21+
void dfs(TreeNode* node, int targetSum, vector<vector<int>>& res, vector<int>&& path) {
22+
if (node == nullptr) return;
23+
path.emplace_back(node->val);
24+
targetSum -= node->val;
25+
if (node->left == nullptr && node->right == nullptr) {
26+
if (targetSum == 0) {
27+
res.emplace_back(path);
28+
}
29+
return;
30+
}
31+
if (node->left != nullptr) {
32+
dfs(node->left, targetSum, res, std::move(path));
33+
path.pop_back();
34+
}
35+
if (node->right != nullptr) {
36+
dfs(node->right, targetSum, res, std::move(path));
37+
path.pop_back();
38+
}
39+
}
40+
};
41+
42+
void test() {
43+
Solution s;
44+
int nullptr_value = -1;
45+
TreeNode* root =
46+
treeHelper::build({5, 4, 8, 11, nullptr_value, 13, 4, 7, 2, nullptr_value, nullptr_value, 5, 1}, nullptr_value);
47+
vector<vector<int>> expected = {
48+
{5, 4, 11, 2},
49+
{5, 8, 4, 5}
50+
};
51+
vector<vector<int>> res = s.pathSum(root, 22);
52+
assert(res == expected);
53+
treeHelper::free(root);
54+
55+
root = treeHelper::build({1, 2, 3}, nullptr_value);
56+
expected = {};
57+
res = s.pathSum(root, 5);
58+
assert(res == expected);
59+
treeHelper::free(root);
60+
}
61+
62+
int main() {
63+
test();
64+
return 0;
65+
}

‎src/114-flatten.cpp‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
//
2+
// Created by 1412 on 2025/12/13.
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+
void flatten(TreeNode* root) {
14+
if (root == nullptr) return;
15+
stack<TreeNode*> s{{root}};
16+
while (!s.empty()) {
17+
auto node = s.top();
18+
s.pop();
19+
if (node->right != nullptr) s.push(node->right);
20+
if (node->left != nullptr) s.push(node->left);
21+
if (!s.empty()) {
22+
node->right = s.top();
23+
}
24+
node->left = nullptr;
25+
}
26+
}
27+
};
28+
29+
void test() {
30+
Solution s;
31+
int nullptr_val = -1;
32+
TreeNode* root = treeHelper::build({1, 2, 5, 3, 4, nullptr_val, 6});
33+
TreeNode* expected =
34+
treeHelper::build({1, nullptr_val, 2, nullptr_val, 3, nullptr_val, 4, nullptr_val, 5, nullptr_val, 6});
35+
s.flatten(root);
36+
assert(treeHelper::equal(root, expected));
37+
treeHelper::free(root);
38+
treeHelper::free(expected);
39+
40+
root = treeHelper::build({});
41+
expected = treeHelper::build({});
42+
s.flatten(root);
43+
assert(treeHelper::equal(root, expected));
44+
treeHelper::free(root);
45+
treeHelper::free(expected);
46+
47+
root = treeHelper::build({0}, nullptr_val);
48+
expected = treeHelper::build({0}, nullptr_val);
49+
s.flatten(root);
50+
assert(treeHelper::equal(root, expected));
51+
treeHelper::free(root);
52+
treeHelper::free(expected);
53+
}
54+
55+
int main() {
56+
test();
57+
return 0;
58+
}

‎src/116-connect.cpp‎

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
//
2+
// Created by 1412 on 2025/12/13.
3+
//
4+
5+
#include <bits/stdc++.h>
6+
7+
using namespace std;
8+
9+
class Node {
10+
public:
11+
int val;
12+
Node* left;
13+
Node* right;
14+
Node* next;
15+
16+
Node()
17+
: val(0),
18+
left(NULL),
19+
right(NULL),
20+
next(NULL) {}
21+
22+
Node(int _val)
23+
: val(_val),
24+
left(NULL),
25+
right(NULL),
26+
next(NULL) {}
27+
28+
Node(int _val, Node* _left, Node* _right, Node* _next)
29+
: val(_val),
30+
left(_left),
31+
right(_right),
32+
next(_next) {}
33+
34+
static Node* build(const std::vector<int>& vec, int nullptr_val = -1) {
35+
if (vec.empty() || vec[0] == nullptr_val) return nullptr;
36+
37+
std::queue<Node*> q;
38+
auto* root = new Node(vec[0]);
39+
q.push(root);
40+
41+
size_t i = 1;
42+
while (!q.empty() && i < vec.size()) {
43+
Node* cur = q.front();
44+
q.pop();
45+
46+
if (i < vec.size() && vec[i] != nullptr_val) {
47+
cur->left = new Node(vec[i]);
48+
q.push(cur->left);
49+
}
50+
i++;
51+
52+
if (i < vec.size() && vec[i] != nullptr_val) {
53+
cur->right = new Node(vec[i]);
54+
q.push(cur->right);
55+
}
56+
i++;
57+
}
58+
return root;
59+
}
60+
61+
static bool equal(Node* lhs, Node* rhs) {
62+
if (lhs == nullptr && rhs == nullptr) return true;
63+
if (lhs == nullptr || rhs == nullptr) return false;
64+
return lhs->val == rhs->val && equal(lhs->left, rhs->left) && equal(lhs->right, rhs->right) &&
65+
equal(lhs->next, rhs->next);
66+
}
67+
68+
static void free(const Node* root) {
69+
if (root == nullptr) return;
70+
free(root->left);
71+
free(root->right);
72+
delete root;
73+
}
74+
};
75+
76+
class Solution {
77+
public:
78+
Node* connect(Node* root) {
79+
if (root == nullptr) return nullptr;
80+
queue<Node*> q{{root}};
81+
while (!q.empty()) {
82+
auto size = q.size();
83+
for (size_t i = 0; i < size; ++i) {
84+
Node* node = q.front();
85+
q.pop();
86+
if (node->left != nullptr) q.push(node->left);
87+
if (node->right != nullptr) q.push(node->right);
88+
if (i < size - 1) node->next = q.front();
89+
}
90+
}
91+
return root;
92+
}
93+
};
94+
95+
void test() {
96+
Solution s;
97+
auto root = Node::build({1, 2, 3, 4, 5, 6, 7});
98+
auto expected = Node::build({1, 2, 3, 4, 5, 6, 7});
99+
expected->left->next = expected->right;
100+
expected->left->left->next = expected->left->right;
101+
expected->left->right->next = expected->right->left;
102+
expected->right->left->next = expected->right->right;
103+
root = s.connect(root);
104+
assert(Node::equal(root, expected));
105+
free(root);
106+
free(expected);
107+
root = Node::build({});
108+
expected = Node::build({});
109+
root = s.connect(root);
110+
assert(Node::equal(root, expected));
111+
free(root);
112+
free(expected);
113+
}
114+
115+
int main() {
116+
test();
117+
return 0;
118+
}

‎src/117-connect.cpp‎

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
//
2+
// Created by 1412 on 2025/12/13.
3+
//
4+
5+
#include <bits/stdc++.h>
6+
7+
using namespace std;
8+
9+
class Node {
10+
public:
11+
int val;
12+
Node* left;
13+
Node* right;
14+
Node* next;
15+
16+
Node()
17+
: val(0),
18+
left(NULL),
19+
right(NULL),
20+
next(NULL) {}
21+
22+
Node(int _val)
23+
: val(_val),
24+
left(NULL),
25+
right(NULL),
26+
next(NULL) {}
27+
28+
Node(int _val, Node* _left, Node* _right, Node* _next)
29+
: val(_val),
30+
left(_left),
31+
right(_right),
32+
next(_next) {}
33+
34+
static Node* build(const std::vector<int>& vec, int nullptr_val = -1) {
35+
if (vec.empty() || vec[0] == nullptr_val) return nullptr;
36+
37+
std::queue<Node*> q;
38+
auto* root = new Node(vec[0]);
39+
q.push(root);
40+
41+
size_t i = 1;
42+
while (!q.empty() && i < vec.size()) {
43+
Node* cur = q.front();
44+
q.pop();
45+
46+
if (i < vec.size() && vec[i] != nullptr_val) {
47+
cur->left = new Node(vec[i]);
48+
q.push(cur->left);
49+
}
50+
i++;
51+
52+
if (i < vec.size() && vec[i] != nullptr_val) {
53+
cur->right = new Node(vec[i]);
54+
q.push(cur->right);
55+
}
56+
i++;
57+
}
58+
return root;
59+
}
60+
61+
static bool equal(Node* lhs, Node* rhs) {
62+
if (lhs == nullptr && rhs == nullptr) return true;
63+
if (lhs == nullptr || rhs == nullptr) return false;
64+
return lhs->val == rhs->val && equal(lhs->left, rhs->left) && equal(lhs->right, rhs->right) &&
65+
equal(lhs->next, rhs->next);
66+
}
67+
68+
static void free(const Node* root) {
69+
if (root == nullptr) return;
70+
free(root->left);
71+
free(root->right);
72+
delete root;
73+
}
74+
};
75+
76+
class Solution {
77+
public:
78+
Node* connect(Node* root) {
79+
if (root == nullptr) return nullptr;
80+
queue<Node*> q{{root}};
81+
while (!q.empty()) {
82+
auto size = q.size();
83+
for (size_t i = 0; i < size; ++i) {
84+
Node* node = q.front();
85+
q.pop();
86+
if (node->left != nullptr) q.push(node->left);
87+
if (node->right != nullptr) q.push(node->right);
88+
if (i < size - 1) node->next = q.front();
89+
}
90+
}
91+
return root;
92+
}
93+
};
94+
95+
void test() {
96+
Solution s;
97+
int nullptr_val = -1;
98+
auto root = Node::build({1, 2, 3, 4, 5, nullptr_val, 7}, nullptr_val);
99+
auto expected = Node::build({1, 2, 3, 4, 5, nullptr_val, 7}, nullptr_val);
100+
expected->left->next = expected->right;
101+
expected->left->left->next = expected->left->right;
102+
expected->left->right->next = expected->right->right;
103+
root = s.connect(root);
104+
assert(Node::equal(root, expected));
105+
free(root);
106+
free(expected);
107+
root = Node::build({});
108+
expected = Node::build({});
109+
root = s.connect(root);
110+
assert(Node::equal(root, expected));
111+
free(root);
112+
free(expected);
113+
}
114+
115+
int main() {
116+
test();
117+
return 0;
118+
}

0 commit comments

Comments
 (0)