删除节点
对于一个要被删除的节点来说,它会处于两种状态,一种是左子树右子树至少有一个是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;
}
对于左右子树都存在的节点来说则较为复杂,有两种处理方式 (这里采用了第二种方式)
- 寻找其左子树最靠右下的节点
- 寻找其右子树最靠左下的节点
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?