在左式堆(Leftist Heap)中,节点和关键码(Key)的概念是区分开来的。关键码通常是指存储在堆内部节点中的值,这些值用于维持堆的性质(例如,最大堆或最小堆)。而外部节点(也称为虚拟节点或哨兵节点)是左式堆中一个特殊的概念,它们不包含关键码信息,但携带了拓展信息,如 npl(null path length)。
关键码(Key)
- **关键码**是左式堆中每个内部节点所持有的数据值。在最大堆中,父节点的关键码总是大于或等于其子节点的关键码;在最小堆中,父节点的关键码总是小于或等于其子节点的关键码。
- 关键码用于比较节点之间的大小,以维持堆的性质。
节点(Node)
- **节点**是左式堆的基本组成单位,每个节点可以包含关键码、指向其子节点的指针、以及可能的额外信息(如 npl)。
- 节点可以是内部节点,也可以是外部节点。
外部节点(External Node)
- **外部节点**是左式堆中不包含关键码的节点。它们通常用于表示空(或外部)的子节点,即当一个节点没有左子节点或右子节点时,该位置会被一个外部节点占据。
- 外部节点通常用来简化边界条件的处理,使得算法的实现更加统一和简洁。
npl(Null Path Length)
- **npl** 是左式堆中每个节点的一个属性,表示从该节点到其最远叶子节点的最短路径上的边的数目。对于外部节点,npl 被定义为 -1,因为它们没有子节点。
- npl 的值用于确保左式堆的合并操作能够高效进行。在左式堆中,对于任意节点,其左子节点的 npl 值总是大于或等于其右子节点的 npl 值。
左式堆的构建和操作
在构建左式堆时,每个内部节点都会包含一个关键码,而外部节点则不包含关键码。左式堆的操作,如插入、删除和合并,都需要维护节点的 npl 值,以保持左式堆的性质。
例子
假设我们有一个左式堆,其中包含以下节点:
- 内部节点 A,关键码为 10,npl 为 2。
- 内部节点 B,关键码为 5,npl 为 1,是 A 的左子节点。
- 外部节点 C,作为 A 的右子节点,npl 为 -1。
在这个例子中,节点 A 和 B 是内部节点,包含关键码和 npl 值。节点 C 是一个外部节点,它不包含关键码,但有一个 npl 值(-1),表示它是一个外部节点。
结论
左式堆中的节点和关键码是两个不同的概念。关键码是内部节点的数据值,用于维持堆的性质。外部节点不包含关键码,但它们携带了拓展信息,如 npl,这些信息对于左式堆的操作至关重要。通过区分内部节点和外部节点,左式堆能够有效地管理和优化其结构,特别是在合并操作中。