在二叉搜索树(BST)中,我试图了解中序前驱的属性,特别是具有左子树的节点。
定义:一个节点的中序前驱是其左子树中的最大节点。
观察:我很好奇,当所讨论的节点具有左子树时,中序前驱是否始终是叶节点。
考虑以下二叉搜索树:
5
/ \
3 7
/ \
2 4
在这棵树中:
节点 3(具有左子树)的中序前驱是 2。节点 2 是叶节点。
问题:
我的理解正确吗?
这条规则有例外吗?
BST 中的中序前驱的一般性质是什么?
感谢您的帮助!
这并不总是正确的。
如果节点 𝑢 有一个以 𝑣 为根的左子树,则 𝑢 的中序前驱就是以 𝑣 为根的子树中键最大的节点 𝑤。𝑤 是位于从 𝑤 开始的最长向下路径末端的节点,该路径不包含左向边。因此,𝑤(中序前驱)没有右子树。但其潜在左子树没有约束。
例如,以此二叉搜索树为例:
4 的前身是 2,它有一个左孩子 (1)。8 的前身是 6,它也有一个左孩子 (5)。20 的前身是 12,它有一个左子树 (根节点为 10)。30 的前身是 27,它有一个左孩子 (25)。这些例子足以说明这些前身不一定是叶子。
共同的不变量是这些前任没有右孩子。
一般而言,不仅在查看具有左子树的节点时,节点的前身可以是BST 中的任何节点,但具有最大值的节点除外。显然情况确实如此,因为所有这些节点都有一个后继,因此它们是后继的前身。
具体来说,当一个节点没有左子树时,它的前任(如果有的话)必然是一个有右子树的节点。这与你的情况正好相反,因此前任没有左子树或右子树存在的识别属性。