使用树实现堆

时间:2018-03-12 15:41:33

标签: java data-structures binary-tree heap inner-classes

关于此问题已经有很多问题(例如使用树实现堆),但它们都没有接受答案。所以,我在这里再次提出问题,提出更清楚的问题。
二叉树已经实现,二叉树的私有内部类包括

    T element;
    Node<T> parent;
    Node<T> leftChild;
    Node<T> rightChild;

所以,我参考了element,parent,leftChild,rightChild。
内心类包含每个吸气剂和二传手 内部类正在实现Position<T>接口,它只有一个方法 getElement()

BinaryTree 具有以下访问方法

size()//Returns size of tree
parent(Position<T> node)//return Position<T> of parent of node
left(Position<T> node)//return Position<T> of leftChild of node
right(Position<T> node)//return Position<T> of rightChild of node
numChildren(Position<T> node)//to return number of children of node

更新方法包括

 addRoot(T element)//element will be added as root if tree is empty
 addLeft(Position<T> position,T element)//Left child to be added at position
 addRight(Position<T> position,T element)//right child to be added at position
 set(Position<T> position,T element)//Element of positon will be changed to
                      //element passed in pareameter and previous element will be returned
 remove(Position<T> position)// position will be removed



所以,现在关于堆

[编辑]:我在堆中使用适配器模式实现的二叉树类

要访问最后一个位置,我从root开始然后检查它是否有正确的Child,然后继续直到有少于2的孩子并返回该位置,如果它没有正确的孩子,则从左子继续并且其余的进程相同。
现在,我的位置有一个或零个孩子,现在我可以检查该位置的左侧是否为空,所以向右添加到左侧。

现在添加后我必须检查堆顺序属性,如果不符合 我必须Up-Heap,现在问题是我无法更改父
注意:我无法向二叉树添加新方法

1 个答案:

答案 0 :(得分:0)

由于树中有size()方法,并且您知道树是平衡的,因此可以计算最后一个位置。

          1
        /   \
      2       3
     / \     / \
    4   5   6   7
   /
  8  ...

二进制,即

               1
            /      \
         10           11
        / \          /  \
      100  101    110    111
      / \
   1000  1001  ... 

要从根到达给定位置,您可以删除二进制表示中的第一个“1”,然后使用剩余的数字从根向左(对于0)或向右(对于1)行走。因此,对于大小6 = 0101,你移除第一个'1',留下'01',这意味着向左,然后向右。

另请参阅this question此问题在C中解决。