关于此问题已经有很多问题(例如使用树实现堆),但它们都没有接受答案。所以,我在这里再次提出问题,提出更清楚的问题。
二叉树已经实现,二叉树的私有内部类包括
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,现在问题是我无法更改父
注意:我无法向二叉树添加新方法
答案 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中解决。