# 450. Delete Node in a BST
題目:<https://leetcode.com/problems/delete-node-in-a-bst/>
解法:找出 key 節點,如果 key 節點是葉節點,則刪除它,反之,找出左子樹的最大節點或是右子樹的最小節點,將 key 節點的值用此節點值取代後,再刪除此節點。
Python3:
``` python 3
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def listToTree(arr):
nodes = [TreeNode(arr[0])]
i = 0
j = 1
length = len(arr)
while j < length:
if arr[j] is not None:
tmp = TreeNode(arr[j])
nodes[i].left = tmp
nodes.append(tmp)
j += 1
if j >= length:
break
if arr[j] is not None:
tmp = TreeNode(arr[j])
nodes[i].right = tmp
nodes.append(tmp)
j += 1
i += 1
return nodes[0]
def treeToList(root):
if not root:
return []
from collections import deque
nodes = deque()
nodes.append(root)
arr = []
arr.append(root.val)
while len(nodes):
node = nodes.popleft()
if node.left:
nodes.append(node.left)
arr.append(node.left.val)
else:
arr.append(None)
if node.right:
nodes.append(node.right)
arr.append(node.right.val)
else:
arr.append(None)
return arr
class Solution:
def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
if not root:
return None
delParent = None
keyNode = root
while keyNode:
if key < keyNode.val:
delParent = keyNode
keyNode = keyNode.left
delDir = 0
elif key > keyNode.val:
delParent = keyNode
keyNode = keyNode.right
delDir = 1
else:
break
if not keyNode:
return root
if keyNode.left:
delParent = keyNode
cur = keyNode.left
delDir = 0
while cur.right:
delParent = cur
cur = cur.right
delDir = 1
keyNode.val = cur.val
elif keyNode.right:
delParent = keyNode
cur = keyNode.right
delDir = 1
while cur.left:
delParent = cur
cur = cur.left
delDir = 0
keyNode.val = cur.val
else:
cur = keyNode
if delParent:
if delDir == 0:
delParent.left = cur.left if cur.left else cur.right
elif delDir == 1:
delParent.right = cur.left if cur.left else cur.right
return root
else:
return None
if __name__ == '__main__':
arr = [4,None,7,6,8,5,None,None,9]
root = listToTree(arr)
print(treeToList(root))
val = 7
ans = Solution().deleteNode(root, val)
print(treeToList(ans))
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode* strToTree(char *str) {
char *token = strtok(str, ",");
struct TreeNode **nodes = (struct TreeNode**)malloc(sizeof(struct TreeNode*));
nodes[0] = (struct TreeNode*)malloc(sizeof(struct TreeNode));
nodes[0]->val = atoi(token);
nodes[0]->left = NULL;
nodes[0]->right = NULL;
int i = 0, len = 1;
token = strtok(NULL, ",");
while (token != NULL) {
if (strcmp(token, "null") != 0) {
len++;
nodes = (struct TreeNode**)realloc(nodes, sizeof(struct TreeNode*) * len);
nodes[len - 1] = (struct TreeNode*)malloc(sizeof(struct TreeNode));
nodes[len - 1]->val = atoi(token);
nodes[len - 1]->left = NULL;
nodes[len - 1]->right = NULL;
nodes[i]->left = nodes[len - 1];
}
token = strtok(NULL, ",");
if (token == NULL)
break;
if (strcmp(token, "null") != 0) {
len++;
nodes = (struct TreeNode**)realloc(nodes, sizeof(struct TreeNode*) * len);
nodes[len - 1] = (struct TreeNode*)malloc(sizeof(struct TreeNode));
nodes[len - 1]->val = atoi(token);
nodes[len - 1]->left = NULL;
nodes[len - 1]->right = NULL;
nodes[i]->right = nodes[len - 1];
}
token = strtok(NULL, ",");
i++;
}
return nodes[0];
}
void printLevelOrderWithNull(struct TreeNode* root) {
struct TreeNode * bfs[10000] = {};
bfs[0] = root;
int i = 0, len = 1;
printf("%d ", root->val);
while (i < len) {
if (bfs[i]->left != NULL) {
bfs[len++] = bfs[i]->left;
printf("%d ", bfs[i]->left->val);
} else
printf("null ");
if (bfs[i]->right != NULL) {
bfs[len++] = bfs[i]->right;
printf("%d ", bfs[i]->right->val);
} else
printf("null ");
i++;
}
printf("\n");
}
struct TreeNode* deleteNode(struct TreeNode* root, int key) {
if (root == NULL)
return NULL;
struct TreeNode *delParent = NULL, *keyNode = root, *cur;
int delDir = -1;
while (keyNode != NULL) {
if (key < keyNode->val) {
delParent = keyNode;
keyNode = keyNode->left;
delDir = 0;
} else if (key > keyNode->val) {
delParent = keyNode;
keyNode = keyNode->right;
delDir = 1;
} else
break;
}
if (keyNode == NULL)
return root;
if (keyNode->left) {
delParent = keyNode;
cur = keyNode->left;
delDir = 0;
while (cur->right) {
delParent = cur;
cur = cur->right;
delDir = 1;
}
} else if (keyNode->right) {
delParent = keyNode;
cur = keyNode->right;
delDir = 1;
while (cur->left) {
delParent = cur;
cur = cur->left;
delDir = 0;
}
} else
cur = keyNode;
keyNode->val = cur->val;
if (delParent == NULL)
return NULL;
if (delDir == 0)
delParent->left = cur->left != NULL ? cur->left : cur->right;
else if (delDir == 1)
delParent->right = cur->left != NULL ? cur->left : cur->right;
return root;
}
int main()
{
char input[] = "4,null,7,6,8,5,null,null,9";
struct TreeNode* root = strToTree(input);
printLevelOrderWithNull(root);
printf("\n");
int val = 7;
struct TreeNode* ans = deleteNode(root, val);
printLevelOrderWithNull(ans);
return 0;
}
```
###### tags: `leetcode` `binary tree` `binary search tree`