Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6b360fe

Browse files
Add C++ implementation
Signed-off-by: begeekmyfriend <begeekmyfriend@gmail.com>
1 parent b8bb232 commit 6b360fe

File tree

5 files changed

+91
-31
lines changed

5 files changed

+91
-31
lines changed

‎0105_construct_binary_tree_from_preorder_and_inorder_traversal/binary_tree_build.c‎

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,6 @@ static int find(int num, int size, struct hlist_head *heads)
7373
return -1;
7474
}
7575

76-
static struct TreeNode *node_new(int val)
77-
{
78-
struct TreeNode *tn = malloc(sizeof(*tn));
79-
tn->val = val;
80-
tn->left = NULL;
81-
tn->right = NULL;
82-
return tn;
83-
}
84-
8576
static struct TreeNode *dfs(int *preorder, int pre_low, int pre_high, int *inorder,
8677
int in_low, int in_high, struct hlist_head *in_heads, int size)
8778
{
@@ -107,7 +98,7 @@ static void node_add(int val, int index, int size, struct hlist_head *heads)
10798

10899
static struct TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize)
109100
{
110-
int i, j;
101+
int i;
111102
struct hlist_head *in_heads = malloc(inorderSize * sizeof(*in_heads));
112103
for (i = 0; i < inorderSize; i++) {
113104
INIT_HLIST_HEAD(&in_heads[i]);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
/**
6+
* Definition for a binary tree node.
7+
* struct TreeNode {
8+
* int val;
9+
* TreeNode *left;
10+
* TreeNode *right;
11+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
12+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
13+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
14+
* };
15+
*/
16+
class Solution {
17+
public:
18+
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
19+
for (int i = 0; i < inorder.size(); i++) {
20+
map_[inorder[i]] = i;
21+
}
22+
int size = inorder.size();
23+
return dfs(preorder, 0, size - 1, inorder, 0, size - 1);
24+
}
25+
26+
private:
27+
unordered_map<int, int> map_;
28+
TreeNode* dfs(vector<int>& preorder, int pre_lo, int pre_hi, vector<int>& inorder, int in_lo, int in_hi) {
29+
if (pre_lo > pre_hi || in_lo > in_hi) {
30+
return nullptr;
31+
}
32+
int value = preorder[pre_lo];
33+
TreeNode *root = new TreeNode(value);
34+
int index = map_[value];
35+
root->left = dfs(preorder, pre_lo + 1, pre_lo + (index - in_lo), inorder, in_lo, index - 1);
36+
root->right = dfs(preorder, pre_hi - (in_hi - index) + 1, pre_hi, inorder, index + 1, in_hi);
37+
return root;
38+
}
39+
};

‎0106_construct_binary_tree_from_inorder_and_postorder_traversal/binary_tree_build.c‎

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,6 @@ static int find(int num, int size, struct hlist_head *heads)
7373
return -1;
7474
}
7575

76-
static struct TreeNode *node_new(int val)
77-
{
78-
struct TreeNode *tn = malloc(sizeof(*tn));
79-
tn->val = val;
80-
tn->left = NULL;
81-
tn->right = NULL;
82-
return tn;
83-
}
84-
8576
static void node_add(int val, int index, int size, struct hlist_head *heads)
8677
{
8778
struct order_node *on = malloc(sizeof(*on));
@@ -91,23 +82,23 @@ static void node_add(int val, int index, int size, struct hlist_head *heads)
9182
hlist_add_head(&on->node, &heads[hash]);
9283
}
9384

94-
static struct TreeNode *dfs(int *inorder, int in_low, int in_high, int *postorder,
95-
int post_low, int post_high, struct hlist_head *in_heads, int size)
85+
static struct TreeNode *dfs(int *inorder, int in_lo, int in_hi, int *postorder,
86+
int post_lo, int post_hi, struct hlist_head *in_heads, int size)
9687
{
97-
if (in_low > in_high || post_low > post_high) {
88+
if (in_lo > in_hi || post_lo > post_hi) {
9889
return NULL;
9990
}
10091
struct TreeNode *tn = malloc(sizeof(*tn));
101-
tn->val = postorder[post_high];
102-
int index = find(postorder[post_high], size, in_heads);
103-
tn->left = dfs(inorder, in_low, index - 1, postorder, post_low, post_low + (index - 1 - in_low), in_heads, size);
104-
tn->right = dfs(inorder, index + 1, in_high, postorder, post_high - (in_high - index), post_high - 1, in_heads, size);
92+
tn->val = postorder[post_hi];
93+
int index = find(postorder[post_hi], size, in_heads);
94+
tn->left = dfs(inorder, in_lo, index - 1, postorder, post_lo, post_lo + (index - 1 - in_lo), in_heads, size);
95+
tn->right = dfs(inorder, index + 1, in_hi, postorder, post_hi - (in_hi - index), post_hi - 1, in_heads, size);
10596
return tn;
10697
}
10798

10899
static struct TreeNode *buildTree(int *inorder, int inorderSize, int *postorder, int postorderSize)
109100
{
110-
int i, j;
101+
int i;
111102
struct hlist_head *in_heads = malloc(inorderSize * sizeof(*in_heads));
112103
for (i = 0; i < inorderSize; i++) {
113104
INIT_HLIST_HEAD(&in_heads[i]);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
/**
6+
* Definition for a binary tree node.
7+
* struct TreeNode {
8+
* int val;
9+
* TreeNode *left;
10+
* TreeNode *right;
11+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
12+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
13+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
14+
* };
15+
*/
16+
class Solution {
17+
public:
18+
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
19+
for (int i = 0; i < inorder.size(); i++) {
20+
map_[inorder[i]] = i;
21+
}
22+
int size = inorder.size();
23+
return dfs(inorder, 0, size - 1, postorder, 0, size - 1);
24+
}
25+
26+
private:
27+
unordered_map<int, int> map_;
28+
TreeNode* dfs(vector<int>& inorder, int in_lo, int in_hi, vector<int>& postorder, int post_lo, int post_hi) {
29+
if (in_lo > in_hi || post_lo > post_hi) {
30+
return nullptr;
31+
}
32+
int value = postorder[post_hi];
33+
TreeNode *root = new TreeNode(value);
34+
int index = map_[value];
35+
root->left = dfs(inorder, in_lo, index - 1, postorder, post_lo, post_lo + (index - in_lo - 1));
36+
root->right = dfs(inorder, index + 1, in_hi, postorder, post_hi - (in_hi - index), post_hi - 1);
37+
return root;
38+
}
39+
};

‎0124_binary_tree_maximum_path_sum/bst_max_path.c‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,18 @@ static int dfs(struct TreeNode *root, int *max)
2020
}
2121

2222
/* In case of negative node value */
23-
int l = maximum(dfs(root->left, max), 0);
24-
int r = maximum(dfs(root->right, max), 0);
23+
int subl = maximum(dfs(root->left, max), 0);
24+
int subr = maximum(dfs(root->right, max), 0);
2525

26-
int sum = root->val + l + r;
26+
int sum = root->val + subl + subr;
2727
if (sum > *max) {
2828
*max = sum;
2929
}
3030

3131
/* The return value does not equal the sum value
3232
* since we need to return path through the root node
3333
*/
34-
return root->val + maximum(l, r);
34+
return root->val + maximum(subl, subr);
3535
}
3636

3737
static int maxPathSum(struct TreeNode* root)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /