二叉树删除节点 c++

硅谷探秘者 3272 0 0

二叉树删除节点 c++

先看一个简单的树图


image.png

删除节点是分以下几种情况:

    1.待删节点为叶子节点:此种情况下直接删除叶子节点即可

    2.待删节点只有左子树,或只有右子树,那么将左子树或右子树的根节点替换该节点即可

    3.待删节点既有左子树,又有右子树,那么就需要先找到该节点的后继节点,用后继节点替换该节点。


情况1

image.png

情况2

image.png

情况3

image.png

附代码:

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;
}



评论区
请写下您的评论...
暂无评论...
猜你喜欢
数据结构与算法 4976 基本操作c++classnode{public: intdata; node*left; node*right; node(); node(intdata); node(intdata
weblog 2128 因为需求需要,所以直接写一个数据结构 直接上代码: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceConsoleApplication2 { classProgram { staticvoidMai
weblog 5313 什么是的前驱和后继?某的前驱的val值小于该的val值并且值是最大的那个。某的后继的val值大于该的val值并且值是最小的那个。下面给出一个
official 831 请编写一个函数,使其可以某个链表中给定的(非末尾)。传入函数的唯一参数为要被。现有一个链表--head=[4,5,1,9],它可以表示为:示例1:输入:head=[4,5,1,9],n
数据结构与算法 8148 )java代码实现importjava.util.LinkedList;/***类*@author硅谷探秘者(jia)*/classNode{ publicintdata; publicNodele
official 926 。本题中,一棵高度平衡定义为:一个每个的左右两个子的高度差的绝对值不超过1。示例1案例输入:root=[3,9,20,null,null,15,7],输出:true示例2案例输入:r
数据结构与算法 2154 简单双向链表得增改查c++描述classnode{public:intdata;node*next;node*prev;};#include"node.h"classrelink
其他 3041 在.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
标签
算法基础 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
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。