演示2-3树删除时为什么空节点只有一个子节点

来源:互联网 发布:linux查看进程命令 编辑:程序博客网 时间:2024/05/08 01:41

演示删除时,为什么空节点下都只有一个子节点?自己好像是能想明白,但隔一段时间,再看时,又有点迷茫。所以尝试着下来,加深理解。

1. 初始空节点的产生

要删除的关键字要么就是在叶节点;要么交换中序排列中后一个关键字后到了叶节点。总之最终要删除的关键字都会落到叶节点中。

如果叶节点是3-node,删除这个关键字,3-node变为2-node,就没有空节点。

如果叶节点是2-node,删除这个关键字,2-node就变为了空节点。也就是初始空节点就是删除2-node叶节点的关键字得到的。对这个初始空节点,我们认为它只有一个子节点,而且这个子节点就是空节点,如下图。      

 

2. 删除过程中产生新的空节点。

如果初始空节点的父节点是3-node或者兄弟节点是3-node,经过相应操作,树中不再含有空节点,删除结束。

如果初始空节点的父节点和兄弟节点都是2-node,则要合并父节点和兄弟节点;释放初始空节点,原来的父节点又变成了空节点,这时的空节点下面就只有一个子节点。如下图的例子。

删除节点15,它是2-node,

删除这个关键字后,叶节点15变为空节点。


空节点的父节点和兄弟节点都是2-node,合并父节点和兄弟节点;合并后父节点变为空节点;原来的空节点被释放。


因为合并操作,现在空节点下就只有一个节点了!空节点下只有一个节点,是因为空节点原来的关键字和其两个节点中的一个子节点的关键字合并成了一个新的节点,而其另外一个子节点是上次的空节点,被释放了。

再进行删除操作,20和27合并,节点20就变为空节点。上次的空节点就被释放了。现在的空节点下面也是只有一个子节点。


删除空的根节点,得到新的根节点。

3. 小结

初始的叶节点是2-node,删除关键字后变为空节点,我们认为它有一个子节点。

如果空节点的父节点和子节点都是2-node,合并父节点的关键字和子节点的关键字,得到一个新的3-node节点,然后父节点就变为空节点,同时释放原来的空节点。这样空节点下同样只有一个关键字。

如果空节点父节点和子节点至少有一个是3-node,那么空节点被释放(通过合并操作)或者空节点被重新填入关键字。总之树上不在有空节点。删除操作结束。

因此在演示删除关键字的各种情况时,如果有空节点等待删除,那么就可以认为这个空节点下只有一个子节点。

另外在用graphviz时,开始都是保持图片,使用中发现,每次运行脚本后,在脚本保持的目录下就生成“.png”文件,就是当前脚本运行产生的图像;如果脚本没有保存,就在安装目录下的bin目录下生成一个“.png”文件。这样就不需要每次都额外的点击“graph-->setting->output file name”来保存文件了。

原创粉丝点击