导航

二叉查找树删除节点

Posted on 2022-06-03 00:00  wuqiu  阅读(286)  评论(0编辑  收藏  举报

删除节点

对于一个要被删除的节点来说,它会处于两种状态,一种是左子树右子树至少有一个是NULL,另一种是左子树右子树都存在。
对于有NULL的节点来说,删除它很简单只需要将其删掉并用子节点替换它的位置即可。

        if(root->right == NULL){//右子树为空
            tmp = root;
            root = root -> left;//用左子树替代当前位置
            delete tmp;//将原指针指向位置内存释放  delete 用于回收new 开辟的空间
        } 
        else if(root -> left == NULL){
            tmp = root;
            root = root -> right;
            delete tmp;
        }

对于左右子树都存在的节点来说则较为复杂,有两种处理方式 (这里采用了第二种方式)

  1. 寻找其左子树最靠右下的节点
  2. 寻找其右子树最靠左下的节点
            TreeNode* s = NULL;
            tmp = root;
            s = root -> right;
            while(s -> left){
                tmp = s;//tmp 用来记录 s 的父节点 以便删除s节点后可以续接 s 右子节点
                s = s->left;//s指针不断向左下寻找最小节点
            }
            root -> val = s -> val; //直接进行值的替换
            if(tmp != root){//如果说向下走了几步 续接的就是左子节点
                tmp -> left = s->right;
            }
            else{ //如果root的右子树没有左子节点,则续接的为root的右子节点
                tmp -> right = s->right;
            }
            delete s;//释放s处的内存

450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void delete_(TreeNode* &root){
        if(root == NULL)    return ;
        TreeNode* tmp = NULL;
        if(root->right == NULL){
            tmp = root;
            root = root -> left;
            delete tmp;
        }
        else if(root -> left == NULL){
            tmp = root;
            root = root -> right;
            delete tmp;
        }
        else{
            TreeNode* s = NULL;
            tmp = root;
            s = root -> right;
            while(s -> left){
                tmp = s;
                s = s->left;
            }
            root -> val = s -> val;
            if(tmp != root){
                tmp -> left = s->right;
            }
            else{
                tmp -> right = s->right;
            }
            delete s;
        }
    }
    TreeNode* deleteNode(TreeNode* &root, int key) {
        if(root == NULL)    return NULL;
        else{
            if(key < root->val){
                deleteNode(root->left,key);
            }
            else if(key > root->val){
                deleteNode(root->right,key);
            }
            else{
                delete_(root);
            }
        }
        return root;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/delete-node-in-a-bst