Skip to content

Commit d2741d5

Browse files
Refine
Signed-off-by: begeekmyfriend <[email protected]>
1 parent 468a05f commit d2741d5

File tree

5 files changed

+50
-43
lines changed

5 files changed

+50
-43
lines changed

098_validate_binary_search_tree/valid_bst.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,34 @@
33
#include <stdbool.h>
44
#include <limits.h>
55

6+
67
struct TreeNode {
78
int val;
89
struct TreeNode *left;
910
struct TreeNode *right;
1011
};
1112

12-
static bool dfs(struct TreeNode* node, int min, int max)
13-
{
14-
if (node == NULL) return true;
15-
if (node->val < min || node->val > max) return false;
16-
if (node->left != NULL && node->val == INT_MIN) return false;
17-
if (node->right != NULL && node->val == INT_MAX) return false;
18-
return dfs(node->left, min, node->val - 1) && dfs(node->right, node->val + 1, max);
19-
}
20-
21-
static bool isValidBST(struct TreeNode* root)
13+
bool isValidBST(struct TreeNode* root)
2214
{
23-
return dfs(root, INT_MIN, INT_MAX);
15+
int top = 0;
16+
int prev = INT_MIN;
17+
bool first = true;
18+
struct TreeNode *stack[1000];
19+
while (top > 0 || root != NULL) {
20+
if (root != NULL) {
21+
stack[top++] = root;
22+
root = root->left;
23+
} else {
24+
root = stack[--top];
25+
if (!first && prev >= root->val) {
26+
return false;
27+
}
28+
first = false;
29+
prev = root->val;
30+
root = root->right;
31+
}
32+
}
33+
return true;
2434
}
2535

2636
int main(int argc, char **argv)

099_recover_binary_search_tree/recover_bst.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,48 +2,48 @@
22
#include <stdlib.h>
33
#include <stdbool.h>
44

5+
56
struct TreeNode {
67
int val;
78
struct TreeNode *left;
89
struct TreeNode *right;
910
};
1011

11-
static void traverse(struct TreeNode *node, struct TreeNode **prev,
12-
struct TreeNode **p1, struct TreeNode **p2, int *wrong)
12+
static void dfs(struct TreeNode *node, struct TreeNode **prev,
13+
struct TreeNode **p1, struct TreeNode **p2, int *wrong)
1314
{
14-
if (node->left != NULL) {
15-
traverse(node->left, prev, p1, p2, wrong);
15+
if (node == NULL || *wrong == 2) {
16+
return;
1617
}
1718

19+
dfs(node->left, prev, p1, p2, wrong);
20+
21+
/* We must use pointer to pointer for previous object in recursion */
1822
if (*prev != NULL && node->val < (*prev)->val) {
1923
(*wrong)++;
2024
if (*wrong == 1) {
2125
*p1 = *prev;
26+
/* p2 should be recorded here in some cases */
2227
*p2 = node;
2328
} else if (*wrong == 2) {
2429
*p2 = node;
25-
return;
2630
}
2731
}
2832
*prev = node;
2933

30-
if (node->right != NULL) {
31-
traverse(node->right, prev, p1, p2, wrong);
32-
}
34+
dfs(node->right, prev, p1, p2, wrong);
3335
}
3436

3537
static void recoverTree(struct TreeNode* root)
3638
{
37-
if (root != NULL) {
38-
struct TreeNode *prev = NULL;
39-
struct TreeNode *p1 = NULL;
40-
struct TreeNode *p2 = NULL;
41-
int wrong = 0;
42-
traverse(root, &prev, &p1, &p2, &wrong);
43-
int tmp = p1->val;
44-
p1->val = p2->val;
45-
p2->val = tmp;
46-
}
39+
int wrong = 0;
40+
struct TreeNode *prev = NULL;
41+
struct TreeNode *p1 = NULL;
42+
struct TreeNode *p2 = NULL;
43+
dfs(root, &prev, &p1, &p2, &wrong);
44+
int tmp = p1->val;
45+
p1->val = p2->val;
46+
p2->val = tmp;
4747
}
4848

4949
int main(int argc, char **argv)

100_same_tree/same_tree.c

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,16 @@ struct TreeNode {
1010

1111
static bool isSameTree(struct TreeNode* p, struct TreeNode* q)
1212
{
13-
if (p != NULL && q != NULL) {
14-
if (p->val != q->val) {
15-
return false;
16-
}
17-
if (!isSameTree(p->left, q->left)) {
18-
return false;
19-
}
20-
if (!isSameTree(p->right, q->right)) {
21-
return false;
22-
}
23-
} else {
24-
return p == q;
13+
if (p == NULL && q == NULL) {
14+
return true;
2515
}
26-
27-
return true;
16+
if (p == NULL || q == NULL) {
17+
return false;
18+
}
19+
if (p->val != q->val) {
20+
return false;
21+
}
22+
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
2823
}
2924

3025
int main(void)

198_house_robber/robber.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ static int rob(int* nums, int numsSize)
2020
for (i = 1; i < numsSize; i++) {
2121
int tmp_taken = taken;
2222
int tmp_untaken = untaken;
23+
/* Taken or untaken nums[i] */
2324
taken = untaken + nums[i];
2425
untaken = max(tmp_taken, tmp_untaken);
2526
}

213_house_robber_ii/robber.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ static int _rob(int* nums, int numsSize)
1616
for (i = 1; i < numsSize; i++) {
1717
int tmp_taken = taken;
1818
int tmp_untaken = untaken;
19+
/* Taken or untaken nums[i] */
1920
taken = tmp_untaken + nums[i];
2021
untaken = max(tmp_taken, tmp_untaken);
2122
}

0 commit comments

Comments
 (0)