我有一个链表/二叉树方法库,可在标准容器不适合时使用 - 例如,当有不同类型的节点时,或者当我需要从二叉树转换为列表并再次转换回来时。它包括红黑树处理。
其中一种方法将双链表及时转换为完美平衡的简单二叉树O(n)
(假设项目数是预先知道的)。该算法被称为“折叠”——它是二叉树再平衡算法的后半部分,曾在 Dobbs 博士上发表过。步骤基本...
给定树的大小,决定左右子树的大小
左子树的递归
从列表中弹出一个节点以用作根
递归右子树
将子树链接到根
我也有类似的方法可以创建一棵红黑树。原理相同,但递归跟踪节点高度 - 高度为零的节点创建为红色,所有其他节点为黑色。起始高度计算基于树大小中的最高设置位,并且经过调整,以便完美平衡(2^n)-1
大小的树只有黑色节点(递归只下降到高度一)。
这里的要点是我在叶级别只有红色节点,最多恰好一半的节点是红色的。
问题是,虽然这是生成有效红黑树的一种简单方法,但它不是唯一的选择。避免让一棵完美平衡的树中的所有叶子都变红是一种随意的选择。我可以有交替的红色和黑色节点层。或者,在某些情况下,我可以通过发现完全平衡的子树并(如果需要红色节点)使子树根而不是其所有叶子变为红色,从而显着减少红色节点的数量。
问题是 - 是否有任何实际理由选择一种有效的红黑树形式而不是另一种?
这纯粹是好奇——我知道我没有任何实际的理由——但有谁知道这个选择很重要的专业应用程序吗?