【问题标题】:how to determine a balanced or perfectly balanced Binary search tree ( just from the picture )如何确定平衡或完美平衡的二叉搜索树(仅来自图片)
【发布时间】:2013-12-28 17:58:19
【问题描述】:

我不确定如何确定一棵树是否平衡、完全平衡,或者如果我将其作为图片而不是代码则两者都没有

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

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

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

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

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

这是一棵完美平衡的平衡树:

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

谁能给我解释一下?

【问题讨论】:

  • 虽然 BST 代表二进制“搜索”树,但除了搜索和返回布尔值之外,它还可以作为一种非常快速的数据类型,以排序方式插入、删除、读取数据块。但是,正如您在上一个 sn-p 中所展示的那样,AVL 并不是一个完美平衡的二叉树,因为它仅将级别差视为最大为 1。完美平衡二叉树 (PBBT) 应该关心左右之间的大小差异最大为 1,以便在搜索以外的任务中更有效率。

标签: java c tree binary-tree binary-search-tree


【解决方案1】:

完美平衡的树应该是这样的:

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

平衡:可以说是平衡的,因为每个节点的左右子树的高度相差1或更小(本例中为0),

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

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

编辑:

关于您的最后一届 cmet,您在考试中获得它的事实并不意味着答案在任何意义上都是正确的。完美树的概念与完整性的概念有关,一棵完整的树有时被称为“完美”树,这意味着除了叶子之外每个节点的子节点数是 2 我给你的是一个计算它的方程.第三棵树是平衡的,因为重要的是每个节点的左右子树的深度,而不是左右子树中子树的数量。在这种情况下,从节点 A 开始,左子树的深度为 0,右子树的深度为 0 -> 0 - 0 = 0,从 P 开始,两个深度都是 1 -> 1 - 1 = 0,从根开始,深度为左子树是 1,右子树是 2 -> 2 - 1 = 1

希望对你有帮助!

【讨论】:

  • 感谢您的回答。只是想确定一下。所以因为 b 有 1 个孩子, p 有 2 个孩子,所以它是平衡的吗?
  • 你的完美平衡树方法总是有效吗?因为我有一棵完美平衡的树,但你的方法对它不起作用
  • 注意完美平衡树意味着它必须满足平衡规则和完美规则。可能你的意思是你有一个平衡的树,你能把它加到问题中吗?
  • 当然。我刚刚将其添加到问题中
  • 我很确定第三个是完美平衡的,因为我在考试中得到了它,答案是完美平衡的。我还发现了另一棵完全平衡但不适用于此规则的树:2^(n+1) -1。所以我只是想知道是否有另一种适用于所有事物的方法
【解决方案2】:

完美平衡的 AVL 树的左子树和右子树之间的高度差不会超过 1

【讨论】:

  • 我知道定义,但我不知道如何应用它
  • 零差不是完美平衡的吗?
  • 这是不正确的……左右子树高度差不超过1的AVL树称为高度平衡AVL树。
【解决方案3】:

这个问题应该是关于二叉树(BTs)的,而不仅仅是二叉搜索树(BSTs),因为节点中数据的顺序与树是否平衡无关。一个起点是https://en.wikipedia.org/wiki/Binary_tree,但它有一些问题,因为它有点混杂了各种可能的定义,一些来自 CS,一些来自图论。可能最有用、最不矛盾的一组定义是:

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

使用这些定义:您的第一棵树是完美但不完整,因此不完整--node [b] 缺少一个左孩子,添加它会使树完成;你的第二棵树是退化(一条路径);你的第三棵树是完整的(除了叶子之外的每个节点都有两个孩子)并且1-height-balanced 但都不是“完全平衡(=完美?)”或正如您所声称的,“平衡(意味着 0 高度平衡)”,因为并非从根到叶的每条路径都是相同的长度。

在你的第一棵树中,如果 [b] 有两个孩子,但 [p] 只有一个左孩子,那么它将是几乎完整(完美且完整,除了最后一棵丢失的孩子水平和尽可能正确的空位)——这些对于在数组中存储二进制堆很重要。

Sergio 的例子是complete(完美或高度平衡,并且完整)。 (请注意,使用“平衡”表示“1 高度平衡”或“完美”作为“完整”的同义词,这并不好,只会造成混淆。)

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

在这些定义中需要“高度”的原因是“weight-balanced BT”的概念不同,它根据用途有不同的定义,其中一个是每个节点左侧的节点数子树与右子树相同,另一个是左子树中的节点数至少是右子树中节点数的一半,最多是两倍。

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 2015-07-24
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多