# 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`