二叉树删除节点 c++
二叉树删除节点 c++
先看一个简单的树图
删除节点是分以下几种情况:
1.待删节点为叶子节点:此种情况下直接删除叶子节点即可
2.待删节点只有左子树,或只有右子树,那么将左子树或右子树的根节点替换该节点即可
3.待删节点既有左子树,又有右子树,那么就需要先找到该节点的后继节点,用后继节点替换该节点。
情况1
情况2
情况3
附代码:
head为树的根节点,详细情况请看下一个文章
void trytree::del(int data){//删除节点
node * n=head;
node * parent;
while(n!=NULL){//寻找待删除节点
if(data>n->data){//向右找
parent=n;
n=n->right;
}else if(data<n->data){//向左找
parent=n;
n=n->left;
}else{//相等即待除节点
if(n->left!=NULL&&n->right==NULL){//左节点不为空右节点为空
if(parent->left==n){
parent->left=n->left;
delete(n);
return;
}else{
parent->right=n->left;
delete(n);
return;
}
}else if(n->left==NULL&&n->right!=NULL){//右节点不为空左节点为空
if(parent->left==n){
parent->left=n->right;
delete(n);
return;
}else{
parent->right=n->right;
delete(n);
return;
}
}else if(n->left==NULL&&n->right==NULL){//待删除的节点为叶子节点
if(parent->left==n){
parent->left=NULL;
delete(n);
return;
}else{
parent->right=NULL;
delete(n);
return;
}
}else{//左右孩子节点都不为空
node * sub=n->right;
if(sub->left==NULL){//sub为后继节点
sub->left=n->left;
if(parent->left==n){
parent->left=sub;
delete(n);
return;
}else{
parent->right=sub;
delete(n);
return;
}
}else{
node * p=sub;//后继节点的父节点
while(sub->left!=NULL){//寻找后继节点
p=sub;
sub=sub->left;
}
p->left=NULL;
if(parent->left==n){
sub->left=n->left;
sub->right=n->right;
parent->left=sub;
delete(n);
return;
}else{
sub->left=n->left;
sub->right=n->right;
parent->right=sub;
delete(n);
return;
}
}
}
}
}
cout<<"没有找到"<<endl;
return;
}
评论区
请写下您的评论...
猜你喜欢
blog
二叉树基本操作 c++
数据结构与算法
5231
二叉树基本操作c++classnode{public: intdata; node*left; node*right; node(); node(intdata); node(intdata
weblog
2312
因为需求需要,所以直接写一个数据结构
直接上代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceConsoleApplication2
{
classProgram
{
staticvoidMai
weblog
6156
什么是二叉树的前驱节点和后继节点?某节点的前驱节点的val值小于该节点的val值并且值是最大的那个节点。某节点的后继节点的val值大于该节点的val值并且值是最小的那个节点。下面给出一个二叉树节点类
ofc
删除链表中的节点
official
1034
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为要被删除的节点。现有一个链表--head=[4,5,1,9],它可以表示为:示例1:输入:head=[4,5,1,9],n
数据结构与算法
8385
)java代码实现importjava.util.LinkedList;/***二叉树结点类*@author硅谷探秘者(jia)*/classNode{ publicintdata; publicNodele
ofc
平衡二叉树
official
1161
树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1案例输入:root=[3,9,20,null,null,15,7],输出:true示例2案例输入:r
blog
简单 双向链表得增删改查 c++描述
数据结构与算法
2488
简单双向链表得增删改查c++描述classnode{public:intdata;node*next;node*prev;};#include"node.h"classrelink
其他
3281
在.NET程序中,因为运行中的程序是受系统保护的,不能自己删除自身的,所以自删除的思路是:在关闭本程序之前启动新的进程打开另一个程序,调用这个程序来删除原程序。然后再完成外部进程的销毁。代码如下
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。