Files
leetcode-master/problems/0450.删除二叉搜索树中的节点.md
youngyangyang04 84fe2e4e3b Update
2020-08-15 18:25:23 +08:00

3.4 KiB
Raw Blame History

题目地址

https://leetcode-cn.com/problems/delete-node-in-a-bst/

思路

平衡二叉树中删除节点一下五种情况:

  • 第一种情况:没找到删除的节点,遍历到空节点直接返回了
  • 找到删除的节点
    • 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
    • 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
    • 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
    • 第五种情况:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

第五种情况有点难以理解,看下面动画:

动画中颗二叉搜索树中删除元素7 那么删除节点元素7的左孩子就是5删除节点元素7的右孩子的最左面节点是元素8。

将将删除节点元素7的左孩子放到删除节点元素7的右孩子的最左面节点的左孩子上就是把5为根节点的子树移到了8的左孩子的位置。

接着删除节点元素7右孩子为新的根节点。click也就是元素7位根节点的树现在的根节点变成元素9的根节点的树了.

这样就完成删除元素7的逻辑也可以动手画一个图尝试删除一个节点试试。

代码如下:(详细注释)

C++代码

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == NULL) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了
        if (root->val == key) {
            // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
            // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
            if (root->left == NULL) return root->right; 
            // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
            else if (root->right == NULL) return root->left; 
            // 第五种情况:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子的位置
            // 返回删除节点右孩子为新的根节点。
            else {  
                TreeNode* cur = root->right;
                while(cur->left != NULL) {
                    cur = cur->left;
                }
                cur->left = root->left;
                root = root->right;
                return root;
            }
        }
        if (root->val > key) root->left = deleteNode(root->left, key);
        if (root->val < key) root->right = deleteNode(root->right, key);
        return root;
    }
};

更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。