【问题标题】:Heaping a binary tree堆积二叉树
【发布时间】:2013-11-15 21:25:51
【问题描述】:

我正在学习堆,但我无法理解你应该如何移动每个节点。我将在下面给你一个示例树:

          1
      /      \
     2        3
   /  \      /  \
  4    5    6    7
 / \   /
8   9 10  

这就是我的树。我试图让 10 到节点,但不明白我采取的步骤。我会先看看树的底部吗?这是我的尝试:

          1
      /      \
     2        3
   /  \      /  \
  4    5    6    7
 / \   /
8   9 10 


 -> Move ten up and the two down. 

          1      
      /      \
    10        3
   /  \      /  \
  4    5    6    7
 / \   /
8   9 2 

-> Move the 9 up 

         1      
      /      \
    10        3
   /  \      /  \
  9    5    6    7
 / \   /
8   4 2 

-> move the 7 up

          1      
      /      \
    10        7
   /  \      /  \
  9    5    6    3
 / \   /
8   4 2

-> Move the whole left side up and bring the 1 down.

         10      
      /      \
    9         7
   /  \      /  \
  8    5    6    3
 / \   /
1   4 2

这就是我最终得到的结果,但我觉得这是不对的,因为它不是一棵有序的树。有人可以帮助我了解我哪里出错了吗?

【问题讨论】:

  • 嗯,请参阅 en.wikipedia.org/wiki/Binary_heap ... 请注意,堆不是(必须)有序的,堆是您将树变回堆的操作,但您从一分钟开始heap ...你想把它变成一个最大堆吗?
  • 是的,我正在尝试按降序排列它们
  • 同样,堆不一定是有序的。您的最终结果是最大堆,因为它满足我给出的链接中的两个标准。
  • 非常有趣。当我下线时,我没有违反任何规则?
  • 要将堆转换为最大堆,从最后一个父级开始,将其与其较大的子级交换,然后移动到前一个父级直到到达根。

标签: c algorithm search heap binary-tree


【解决方案1】:

堆不是有序的二叉树。堆保留的唯一顺序是任何子节点小于(或等于)它的父节点。树的同一层级的子节点之间的相对顺序可以是任意的。

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 2011-03-08
    • 2015-06-25
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多