问题应该是关于二叉树(BT)的一般性内容,而不仅仅是二叉搜索树(BST),因为节点中数据的顺序与树是否平衡无关。一个起点是https://en.wikipedia.org/wiki/Binary_tree,但它存在一些问题,因为它是对各种可能定义的混合,一些来自计算机科学,一些来自图论。可能最有用、不矛盾的定义集如下:
一个二叉树是“完美的”或“高度平衡的”,如果每个叶子节点在相同的层级,这等价于从给定节点到叶子节点的每条路径长度相同;它是“满的”,如果每个内部(非叶子)节点有2个子节点;它是“完整的”,如果它是完美和满的;它是“几乎完整的”或“近乎完整的”,如果它是完美的,并且除了最后一层之外的所有层都是满的,并且在最后一层中,叶子节点尽可能靠左(因此任何“空缺”都在右边);它是“退化的”,如果每个非叶子节点只有一个子节点(并且作为图形,它是从根到一个叶子的路径)。
使用这些定义:你的第一棵树是
完美但不完整,因此
不完全--节点[b]缺少左子节点,添加它将使树完整;你的第二棵树是
退化的(一条路径);你的第三棵树是
满的(除了叶子节点外,每个节点都有两个子节点)和
1高度平衡,但不是像你所说的那样“完美平衡(=完美?)”或“平衡(意味着0高度平衡)”,因为从根到叶子的每条路径长度都不相同。
在您的第一棵树中,如果[b]有两个孩子,但[p]只有一个左孩子,那么它将是
几乎完整的(完美和完整,除了最后一层中一些缺失的孩子和尽可能向右的空缺),而这对于在数组中存储二进制堆非常重要。
Sergio的例子是
完整的(完美或高度平衡,且完整)。 (请注意,使用“平衡”表示“1高度平衡”,或使用“完美”作为“完整”的同义词,这样做并不好,只会引起混淆。)
“比完美(或完美平衡)更宽松的是k高度平衡,这意味着从给定节点到叶子的所有路径长度最多相差k,这等价于每个节点的左右子树高度差最多为k。例如,AVL树是1高度平衡的。”
“这些定义需要“高度”的原因在于有一个不同的概念叫做“
权重平衡BT”,具体定义取决于用途,其中之一是对于每个节点,左子树中的节点数与右子树中的节点数相同,另一个定义是左子树中的节点数至少是右子树中节点数的一半且最多是两倍。”