我目前需要实现最大节点堆,其中我的节点类跟踪数据,父节点,然后是左右子节点。我的max heap的insert方法将永远填充100个字符串的数组。这是我的代码:`
public void insert(String name) {
MyNode node = new MyNode(name);
if (root ==null) {
root = node;
}
else {
MyNode parent = findSpot(root);
if(parent.lChild==null) {
parent.lChild=node;
node.setParent(parent);
}
else {
parent.rChild=node;
node.setParent(parent);
}
}
}
public MyNode findSpot(MyNode curr) {
if (curr.lChild == null) {
return curr;
}
else if (curr.rChild==null) {
return curr;
}
else {
if (findSpot(curr.lChild).findHeight(root, curr, 1) > findSpot(curr.rChild).findHeight(root, curr, 1)) {
return findSpot(curr.lChild);
}
else {
return findSpot(curr.rChild);
}
}
}`
如果有人提供建议或告诉我哪些错误,我们将非常感激。
答案 0 :(得分:1)
如果您想查看为什么您的findSpot
函数花了这么长时间,请在输出"findSpot <node>"
的开头添加一行,其中节点的详细信息是搜索。你会发现递归算法被多次调用。看起来findHeight
也经常被调用。我不确定,但看起来你正在对每次插入进行详尽的树搜索。
二进制堆必须保持Shape属性:它是一个完整的二叉树,除了可能是底部行,它是左边填充的。因此,如果您知道堆中有多少个节点,则可以轻松找到下一个节点的插入点。考虑一下这个堆:
1
2 3
4 5 6
堆中有6个节点。每当堆中有6个节点时,树将如下所示,下一个节点的插入点将是最右边节点的右子节点(在本例中为3)。
有趣的是,节点编号的二进制表示告诉我们该节点的位置。例如,二进制6是110
。丢掉第一个数字1,然后你就离开了10
。现在,从根开始并取数字中的下一个数字,如果数字为0则向左移动,如果数字为1则向右移动。然后取下一个数字并执行相同的操作。重复,直到用完数字。
在6的情况下,我们将从根目录转到节点3,然后再转到节点6.
当您添加新节点时,递增计数并按照上述步骤找到插入点。 7是二进制的111
。你离开了高位,留下了11
。然后,从右边开始,插入点就是节点3的右子节点。
当然,一旦将节点放在树中以满足shape属性,就必须执行标准的重堆积来调整树中的节点,以便保持堆属性。