如何确定一个平衡或完全平衡的二进制搜索树(只是从图片)



我不知道如何确定一棵树是平衡的、完全平衡的,或者两者都不平衡,如果我把它作为图片而不是代码

例如,如果我有这棵树如何检查它是平衡的、完全平衡的还是不平衡的?有人能给我举一个完美平衡的树的例子吗?

    [o]
   /   
 [b]   [p]
       / 
  [d]  [m] [r]

很明显,如果树是这样的,我可以判断出它是不平衡的:

      [b]
        
        [d]
         
          [r]
           
           [c]

然而,如果它与上面的非常相似,我不知道如何获得

这是一个完美平衡的树:

        [k]
       /   
      [A]   [p]
            /  
           [N]  [R]

有人能给我解释一下吗?

一个完全平衡的树应该是这样的:

       [ R ]
      /     
    [a]      [b]
   /        /  
 [c]   [d] [e]  [f]

平衡:您可以说它是平衡的,因为每个节点的左右子树的高度相差1或更小(在这种情况下为0),

完美:你可以说它是完美的,因为节点的数量等于2^(n+1)-1,n是树的高度,在这种情况下(2^3)-1=7

在你的例子中,第一棵树是平衡的,但不是完美的,第二棵树不是平衡的,也不是完美的。第三个是平衡的,因为每个节点上的左子树和右子树的深度相差1或更小,但它不是完美的,因为根据完美树方程,节点的数量应该是7,而节点的数量是5。

编辑:

关于你最后的评论,你在考试中得到的事实并不意味着答案在各个方面都是正确的。完美树的概念与完整性的概念有关,完整树有时被称为"完美"树,它意味着除了叶子之外,每个节点的子树数量是2。我给你的是一个计算它的方程。第三棵树是平衡的,因为重要的是每个节点的左右子树的深度,而不是左子树和右子树中的子级数。在这种情况下,从节点A开始,左子树的深度为0,右子树的深度是0->0-0=0,从P开始,两个深度都是1->1-1=0,并且从根开始,从左子树开始的深度是1,从右子树开始的深度是2->2-1=1<-它是平衡的,因为差值应该是1或更小。

希望它能有所帮助!

一个完全平衡的AVL树在左子树和右子树之间的高度差将不超过1

问题应该是关于一般的二进制树(BT),而不仅仅是二进制搜索树(BST),因为节点中数据的顺序与树是否平衡无关。一个开始的地方是https://en.wikipedia.org/wiki/Binary_tree,但它也有一些问题,因为它有点混淆了各种可能的定义,有些来自CS,有些来自图论。可能最有用、最不矛盾的定义是:

BT是完美高度平衡,如果每个叶子都在同一级别,这相当于从给定节点到叶子的每条路径都是相同的长度;如果每个内部(非叶)节点都有2个子节点,则为;如果它是完美和完整的,则它是完整;它是几乎完成接近完成if是完美的,并且除最后一级外的所有级别都是满的,并且在最后一级中,叶子尽可能地向左(所以任何"空位"都在右边);如果每个非叶节点只有一个子节点(作为图,它是从根到一个叶的路径),则它是退化

使用这些定义:您的第一个树是完美但不完整的,因此不完整--node[b]缺少一个子节点,添加它将使树完整;您的第二个树是退化(路径);您的第三棵树是(除叶子外的每个节点都有两个子节点)和1-高度平衡,但既不是您所声称的"完全平衡(=完美?)"也不是"平衡(意味着0-高度平衡)",因为并非从根到叶子的每条路径都是相同的长度。

在第一棵树中,如果[b]有两个子树,而[p]只有一个左边的子树,那么它将是几乎完全(除了最后一级中缺少的一些子树和尽可能右边的空位之外,都是完全的)——这些对于在数组中存储二进制堆很重要。

塞尔吉奥的例子是完整(完美或高度平衡,完整)。(请注意,使用"balanced"表示"1-高度-平衡",或使用"perfect"作为"complete"的同义词,这并不好,只会引起混淆。)

比完美(或完全平衡)更不严格的是k高度平衡,这意味着从给定节点到叶子的所有路径的长度最多相差k,这相当于每个节点的左子树和右子树的高度差最多为k。例如,AVL树是1高度平衡的。

这些定义中需要"高度"的原因是"重量平衡BT"有一个不同的概念,根据用途有不同的定义,其中一个定义是,对于每个节点,左子树中的节点数量与右子树中的相同,另一个是左子树中的节点数量是右子树中节点数量的至少一半且至多两倍。

最新更新