基本操作 O(logn)

图片.png

1. 二分搜索树删除节点:

https://www.runoob.com/data-structures/binary-search-remove.html
方法:移动到要删除的节点,使用右子树最小元素覆盖节点,然后删除右子树最小节点
code

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. //找到key,使用右子树中最小的元素替换key,然后删除右子树中最下的元素
  13. class Solution {
  14. public:
  15. TreeNode* deleteNode(TreeNode* root, int key) {
  16. if(root == NULL)
  17. return NULL;
  18. if(root->val<key){
  19. root->right = deleteNode(root->right,key);
  20. return root;
  21. }
  22. if(root->val>key){
  23. root->left = deleteNode(root->left,key);
  24. return root;
  25. }
  26. if(!root->left) return root->right;
  27. if(!root->right) return root->left;
  28. TreeNode* minNode = root->right;
  29. while(minNode->left!=NULL){
  30. minNode = minNode->left;
  31. }
  32. root->val = minNode ->val;
  33. root->right = deleMin(root->right);
  34. return root;
  35. }
  36. private:
  37. TreeNode* deleMin(TreeNode* node){
  38. if(!node->left)return node->right;
  39. node->left = deleMin(node->left);
  40. return node;
  41. }
  42. };