二叉树删除详解

二叉查找树的删除过程:

假设要删除树T中的某节点z,此时对于如何删除z要分三种情况考虑:

1.      z无子女:此时直接删除z即可

//z无子女
TREE-DELETE0(T,z)
{
	if(z == left[p[z]])
		left[p[z]] = NULL;
	else
		right[p[z]] = NULL;
	p[z] = NULL;
}

2.      z有一个子女:用其子节点代替自己即可

//z只有一个子女
TREE-DELETE1(T,z)
{
	//y为z的子女
	if(left[z] !=NULL)
		y = left[z];
	else
		y = right[z];
	//用y代替z并将z删除
	if(z == left[p[z]])
		p[y] = left[p[z]];
	else
		p[y] = right[p[z]];
	p[z] = NULL;
}

3.      z有两个子女:删除z的后继y(y不会有左子女,删除T中的y对应情况1或2),再用y的内容代替z的内容

//z有两个子女(这里实际上是删除了y)
TREE-DELETE2(T,z)
{
	y = TREE-SUCCESSOR(z);
	x = right[y];
	//z的后继y无子女
	if(x == NULL)
		TREE-DELETE0(T,y);
	else
		TREE-DELETE1(T,y);
	key[z] = key[y];
}

删除二叉查找树的总过程:

TREE-DELETE(T,z)
{
	if(z == root[T])
	{root[T] = NULL;return;}
	bool bleftEmpty = (left[z] == NULL);
	bool brightEmpty = (right[z] == NULL);
	//左右均不为空
	if(!bleftEmpty && !brightEmpty )
		TREE-DELETE2(T,z);
	//左右均为空
	else if(bleftEmpty && brightEmpty)
		TREE-DELETE0(T,z);
	//只有一个子女
	else
		TREE-DELETE1(T,z);
}

可简写为:

1.确定y为要删除的节点:若z无子女则y为z;若z仅有一个子女则y为该子女;若z有两个子女则y为z的后继

if(left[z] == NULL || right[z] == NULL)
		y = z;
	else
		y = TREE-SUCCESSOR(z);

2.将x置为y的非空子女。若y无子女,则x置为空

if(left[y] != NULL)
		x = left[y];
	else
		x = right[y];

3.通过修改p[y]和x的指针删除y

	if(x != NULL)
		p[x] = p[y];
	if(p[y] == NULL)
		root[T] = x;
	else if(y == left[p[y]])
		left[p[y]] = x;
	else
		right[p[y]] = x;

4.如果z的后继就是要被删除的节点,则将y中的内容复制置z:

if(y != z)
		key[z] = key[y];

即:

TREE-DELETE(T,z)
{
	//确定y为要删除的节点
	if(left[z] == NULL || right[z] == NULL)
		y = z;
	else
		y = TREE-SUCCESSOR(z);
	if(left[y] != NULL)
		x = left[y];
	else
		x = right[y];
	if(x != NULL)
		p[x] = p[y];
	if(p[y] == NULL)
		root[T] = x;
	else if(y == left[p[y]])
		left[p[y]] = x;
	else
		right[p[y]] = x;
	if(y != z)
		key[z] = key[y];
}
时间: 2024-10-09 17:12:57

二叉树删除详解的相关文章

Qt QTreeWidget节点的添加+双击响应+删除详解(转)

QTreeWidget是实现树形结构的类,在很多软件中都可以看到类似树形结构的界面. 我做的一个示例如下图,用来处理图像,最顶层节点是图像的路径名,子节点是图像的各个波段,双击各个波段会显示图像各波段的灰度图像,同时还有删除指定节点(父节点和子节点同时删除)的功能.效果如下所示 要完成这样的功能需要注意一下几点: ①.在内存中保存各个节点,当然要在堆上分配内存,删除节点时,除了去除QtreeWidget控件上的节点外,还要讲存储在内存中的节点也要删除,否则会出现内存泄露的问题. ②.节点双击的事

linux 文件删除详解

1.1 linux 文件的存储 linux在建立文件系统时会将磁盘逻辑上规划成各个块,inode块 与block块 每一个块都对应一个号码(inode号 block号),在本文件系统中唯一 ,每个inode 块缺省为256 byte  block块缺省为4K . [[email protected] ~]# dumpe2fs /dev/sda1|egrep  -i "block count|Inode count|block size|inode size" dumpe2fs 1.41

文件删除详解

第1章 创建文件的时候提示no space left to device的解决办法 1.1 inode被用完. 模拟环境: [[email protected] ~]# dd if=/dev/zero of=/dev/test count=10 bs\=10M 10+0 records in 10+0 records out 104857600 bytes (105 MB) copied, 0.303514 s, 345 MB/s [[email protected] ~]# mkfs.ext4

Mysql3:数据的插入、更新、删除详解

插入数据 1)为表的所有字段插入数据 语法 向表中所有字段插入值的方法有两种,一种是指定所有字段名:另一种是完全不指定字段名. 实例: 创建表 插入数据: INSERT语句后面的列名称顺序可以不是person表定义的顺序,即插入数据时,不需要按照表定义的顺序插入,只有保证值得顺序与列字段得顺序相同就可以. 插入数据时,允许列名称列表为空,此时值列表需要为表的每一个字段指定值,并且值得顺序必须和数据表中字段定义时得顺序相同. 2)为指定字段插入数据 在插入记录时,如果某些字段没有指定插入值,Mys

数据结构 - 红黑树(Red Black Tree)插入详解与实现(Java)

最终还是决定把红黑树的篇章一分为二,插入操作一篇,删除操作一篇,因为合在一起写篇幅实在太长了,写起来都觉得累,何况是阅读并理解的读者. 红黑树删除操作请参考 数据结构 - 红黑树(Red Black Tree)删除详解与实现(Java) 现在网络上最不缺的就是对某个知识点的讲解博文,各种花样标题百出,更有类似"一文讲懂xxx","史上最简单的xxx讲解","xxx看了还不懂你打我"之类云云.其中也不乏有些理论甚至是举例都雷同的两篇不同文章,至于作

二叉树的应用详解 - 数据结构

二叉树的应用详解 - 数据结构 概述: 平衡树——特点:所有结点左右子树深度差≤1 排序树——特点:所有结点“左小右大字典树——由字符串构成的二叉排序树判定树——特点:分支查找树(例如12个球如何只称3次便分出轻重)带权树——特点:路径带权值(例如长度) 最优树——是带权路径长度最短的树,又称 Huffman树,用途之一是通信中的压缩编码. 1. 二叉排序树(二叉查找树 Binary Search Tree): 1.1 二叉排序树: 或是一棵空树:或者是具有如下性质的非空二叉树: (1)若左子树

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']

public function getMinLimit () {        $sql = "...";        $result = yii::app()->db->createCommand($sql);        $query = $result->queryAll();         return array (                $query [0] ['max'],         );    } $connection=Yii::

SwipeListView 详解 实现微信,QQ等滑动删除效果

Linux的shell编程 1.什么是shell? 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序. shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序.一般的Linux系统都将bash作为默认的shell. 2.几种流行的shell 目前流行的shell有ash.bash.ksh.csh.zsh等,可以用下面的命令来查看she