首页 > 其他分享 >Day56 代码随想录打卡|二叉树篇---删除二叉搜索树中的节点

Day56 代码随想录打卡|二叉树篇---删除二叉搜索树中的节点

时间:2024-06-20 18:59:46浏览次数:24  
标签:删除 孩子 随想录 二叉树 key 打卡 root 节点 left

题目(leecode T450):

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

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

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

方法:二叉搜索树删除节点需要考虑的情况稍微多一些,下面一一分析,首先考虑递归三部曲。

1:传入参数与返回值:传入的是树结点指针和要删除的值,返回的是删除后的树节点指针。

2:终止条件:遇到空节点就是终止了,说明没有找到要删除的节点,直接返回即可。还有一种情况是找到了需要删除的节点,我们在下面单层递归逻辑具体分析各种情况。

3:单层递归逻辑:对于删除节点一共有五种情况,一一分析

一:没找到要删除的节点就到了空节点,那就直接返回

二:要删除节点的左右孩子节点都为空,是叶子节点,那我们就直接把该节点删除,变为NULL

三:要删除节点的左孩子为空,右孩子不为空,此时我们删除节点,右孩子补位即可。

四:要删除节点的左孩子不为空,右孩子为空,此时我们删除节点,左孩子补位即可。

五:要删除节点的左右孩子都不为空,此时有点复杂,我们要将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

题解:

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == nullptr) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了
        if (root->val == key) {
            // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
            if (root->left == nullptr && root->right == nullptr) {
                ///! 内存释放
                delete root;
                return nullptr;
            }
            // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
            else if (root->left == nullptr) {
                auto retNode = root->right;
                ///! 内存释放
                delete root;
                return retNode;
            }
            // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
            else if (root->right == nullptr) {
                auto retNode = root->left;
                ///! 内存释放
                delete root;
                return retNode;
            }
            // 第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置
            // 并返回删除节点右孩子为新的根节点。
            else {
                TreeNode* cur = root->right; // 找右子树最左面的节点
                while(cur->left != nullptr) {
                    cur = cur->left;
                }
                cur->left = root->left; // 把要删除的节点(root)左子树放在cur的左孩子的位置
                TreeNode* tmp = root;   // 把root节点保存一下,下面来删除
                root = root->right;     // 返回旧root的右孩子作为新root
                delete tmp;             // 释放节点内存(这里不写也可以,但C++最好手动释放一下吧)
                return root;
            }
        }
        if (root->val > key) root->left = deleteNode(root->left, key);
        if (root->val < key) root->right = deleteNode(root->right, key);
        return root;
    }
};

标签:删除,孩子,随想录,二叉树,key,打卡,root,节点,left
From: https://blog.csdn.net/m0_48909584/article/details/139837981

相关文章

  • 【数据结构与算法】二叉树的性质 详解
    在二叉树的第i层上至多有多少个结点。在二叉树的第i层上至多有2i−1......
  • 【数据结构与算法】树,二叉树 详解
    给出树的不同的几种表示形式。邻接矩阵:这是一种二维数组,其中的元素表示两个节点之间是否存在边。这种表示形式适用于稠密图,但对于稀疏图可能会浪费很多空间。邻接表:这是一种数组和链表的组合结构。数组的每个元素都是一个链表,链表中的元素表示与该节点相连的其他节点。这种......
  • 昇思25天学习打卡营第2天|张量、数据集和数据变换
    张量Tensor张量(Tensor)是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在......
  • Leedcode【222】. 完全二叉树的节点个数——Java解法(递归)
    Problem: 222.完全二叉树的节点个数题目思路解题方法复杂度Code效果题目给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的......
  • 代码随想录刷题记录(11)| 二叉树(二叉树理论基础,二叉树的递归遍历,迭代遍历,统一迭代,层序遍
    目录(一)二叉树理论基础1.种类2.存储方式3.遍历方式4.二叉树的定义 (二)二叉树的递归遍历1.思路2.递归遍历(1)前序遍历(2)中序遍历(3)后序遍历(三)二叉树的迭代遍历1.思路2.迭代遍历 (1)前序(2)中序(3)后序(四)二叉树的统一迭代(五)二叉树的层序遍历1.思路2.层序遍......
  • 20240619打卡-个人总结博客
    个人总结1.回顾课程计划完成情况在第一周制定的课程计划中,我列出了具体的目标和期望,并计划通过一系列的学习和实践活动来实现这些目标。具体数据和实际例子如下:目标1:掌握SpringBoot和Vue框架的基本使用。完成情况:通过老师的指导和多次实践,我成功地完成了一个基于SpringB......
  • 20240619打卡-结课博客
    本学期总结博客个人成长与反思随着本学期的结束,我在石家庄铁道大学软件工程专业的学习之旅也迈上了一个新的台阶。回顾这段时间,我不仅在理论知识方面有所提升,更重要的是通过实战项目积累了宝贵的经验。这些经历使我更加认识到,作为一名未来的软件工程师,实操能力和团队合作精神是......
  • 打卡21
    所花时间(包括上课): 2h代码量(行): 150左右搏客量(篇): 1了解到的知识点:安卓备注(其他): 今天进行整合时,发现安卓端的自动检索数据库进行弹窗的功能还没没有进行解决以下是在网上找到的思路创建一个名为DatabaseChecker的线程,在其中实现与My......
  • 打卡18
    所花时间(包括上课): 2h代码量(行): 150左右搏客量(篇): 1了解到的知识点:安卓备注(其他): packagecom.example.app_02;importandroidx.appcompat.app.AppCompatActivity;importandroid.annotation.SuppressLint;importandroid.content.Con......
  • 打卡20
    所花时间(包括上课): 2h代码量(行): 150左右搏客量(篇): 1了解到的知识点:安卓备注(其他): packagecom.example.app_02;importandroid.annotation.SuppressLint;importandroid.content.Context;importandroid.content.DialogInterface;impo......