题目:
Given a root of Binary Search Tree with unique value for each node. Remove the node with given value. If there is no such a node with given value in the binary search tree, do nothing. You should keep the tree still a binary search tree after removal.
Given binary search tree:
5
/
3 6
/
2 4
Remove 3, you can either return:
5
/
2 6
4
or
5
/
4 6
/
2
题解:
这个题就是考察对二叉树操作的熟练程度,没有多少技巧,下面的程序中唯一能算作技巧的是更换node时有时并不需要切断其与左右节点和父节点的链接,只需要更换val值就可以了。
Solution 1 ()
class Solution { public: TreeNode* removeNode(TreeNode* root, int value) { if (root == NULL) return NULL; TreeNode * head = new TreeNode(); head->left = root; TreeNode * tmp = root, *father = head; while (tmp != NULL) { if (tmp->val == value) break; father = tmp; if (tmp->val > value) tmp = tmp->left; else tmp = tmp->right; } if (tmp == NULL) return head->left; if (tmp->right == NULL) { if (father->left == tmp) father->left = tmp->left; else father->right = tmp->left; } else if (tmp->right->left == NULL) { if (father->left == tmp) father->left = tmp->right; else father->right = tmp->right; tmp->right->left = tmp->left; } else { father = tmp->right; TreeNode * cur = tmp->right->left; while (cur->left != NULL) { father = cur; cur = cur->left; } tmp->val = cur->val; father->left = cur->right; } return head->left; } };
用右子树最小值替代
Solution 2 ()
class Solution { public: TreeNode* removeNode(TreeNode* root, int value) { if (root == nullptr) { return nullptr; } if (root->val > value) { root->left = removeNode(root->left, value); } else if (root->val < value) { root->right = removeNode(root->right, value); } else { // leaf node if (root->left == nullptr && root->right == nullptr) { root = nullptr; } else if (root->left == nullptr) { root = root->right; } else if (root->right == nullptr) { root = root->left; } else { TreeNode* tmp = findMin(root->right); root->val = tmp->val; root->right = removeNode(root->right, tmp->val); } } return root; } TreeNode* findMin(TreeNode* root) { while (root->left != nullptr) { root = root->left; } return root; } };
用左子树最大值替代
Solution 3 ()
class Solution { public: TreeNode* removeNode(TreeNode* root, int value) { if (root == nullptr) { return nullptr; } if (root->val > value) { root->left = removeNode(root->left, value); } else if (root->val < value) { root->right = removeNode(root->right, value); } else { // leaf node if (root->left == nullptr && root->right == nullptr) { root = nullptr; // only one child } else if (root->left == nullptr) { root = root->right; } else if (root->right == nullptr) { root = root->left; // two child } else { TreeNode* tmp = findMax(root->left); root->val = tmp->val; root->left = removeNode(root->left, tmp->val); } } return root; } TreeNode* findMax(TreeNode* root) { while (root->right != nullptr) { root = root->right; } return root; } };