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