lurenaa的博客

  1. 如果在根节点,怎么操作?

  迭代需要处理根节点的特殊情况,而递归不需要特殊处理。

递归实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
int compar(int a, int b) {
if(a > b) return 1;
else if(b > a) return -1;
return 0;
}
TreeNode* deleteNode(TreeNode* root, int key) {
if(!root)
return nullptr;
int cmp = compar(root->val, key);
if(cmp < 0) {
root->right = deleteNode(root->right, key);
} else if(cmp > 0) {
root->left = deleteNode(root->left, key);
} else {
if(!root->left) return root->right;
if(!root->right) return root->left;
auto rm = min(root->right);
root->right = deleteMin(root->right);
rm->left = root->left;
rm->right = root->right;
root = rm;
}
return root;
}
TreeNode* min(TreeNode* root) {
if(!root->left)
return root;
return min(root->left);
}
TreeNode* deleteMin(TreeNode* root) {
if(!root->left)
return root->right;
root->left = deleteMin(root->left);
return root;
}
};

迭代实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Solution {
public:
int compar(int a, int b) {
if(a > b) return 1;
else if(b > a) return -1;
return 0;
}
TreeNode* deleteNode(TreeNode* root, int key) {
if(!root)
return nullptr;
TreeNode* node = root, *prev_node = nullptr;
bool is_left =false;
while(node) {
int cmp = compar(node->val, key);
if(cmp > 0) {
prev_node = node;
node = node->left;
is_left = true;
}
else if(cmp < 0) {
prev_node = node;
node = node->right;
is_left = false;
} else
break;
}
if(!node && prev_node)
return root;
if(!node->left && !node->right) {
if(!prev_node) return nullptr;
if(is_left) prev_node->left = nullptr;
else prev_node->right = nullptr;
}
else if (node->left && !node->right) {
if(!prev_node) return node->left;
if(is_left) prev_node->left = node->left;
else prev_node->right = node->left;
}
else if (node->right && !node->left) {
if(!prev_node) return node->right;
if(is_left) prev_node->left = node->right;
else prev_node->right = node->right;
} else {
int min_val = min(node->right);
node->val = min_val;
node->right = deleteMin(node->right);
}
return root;
}

int min(TreeNode* node) {
while(node->left)
node = node->left;
return node->val;
}

TreeNode* deleteMin(TreeNode* node) {
if(!node->left)
return node->right;
node->left = deleteMin(node->left);
return node;
}
};

Accepted

85/85 cases passed (24 ms)

Your runtime beats 90.96 % of cpp submissions

Your memory usage beats 5.26 % of cpp submissions (17.6 MB)