最大节点堆 java
Max heap of nodes java
我目前需要实现最大节点堆,我的节点 class 跟踪数据、父节点以及左右子节点。我的最大堆插入方法需要永远填充 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);
}
}
}`
如果有人在代码中提供建议或告诉我哪里出了问题,我们将不胜感激。
如果您想查看 为什么 您的 findSpot
函数花费了这么长时间,请在开头添加一行输出 "findSpot <node>"
,其中正在搜索的节点的详细信息。你会发现递归算法被调用了很多次。看起来 findHeight
也经常被调用。我不确定,但看起来您正在对每次插入进行详尽的树搜索。
二叉堆必须保持形状属性:它是一个完整的二叉树,除了最下面的一行可能是left-filled。因此,如果知道堆中有多少个节点,就可以轻松找到下一个节点的插入点。考虑这个堆:
1
2 3
4 5 6
堆中有6个节点。每当堆中有 6 个节点时,树将如下所示,下一个节点的插入点将是最右边节点(在本例中为 3)的右子节点。
有趣的是,节点号的二进制表示告诉我们该节点在哪里。比如6在二进制中就是110
。去掉第一个数字 1,剩下 10
。现在,从根开始,取数字中的下一个数字,如果数字为 0,则向左移动;如果数字为 1,则向右移动。然后取下一个数字,执行相同的操作。重复直到你 运行 个数字。
在 6 的情况下,我们将从根向右转到节点 3,然后向左转到节点 6。
添加新节点时,增加计数并按照上述步骤定位插入点。 7 在二进制中是 111
。你砍掉高位,留下 11
。然后,从根开始向右,插入点是节点 3 的右子节点。
当然,一旦你把节点放在树中以满足形状属性,你必须做标准的re-heapify来调整树中的节点,以便堆属性 得到维护。
我目前需要实现最大节点堆,我的节点 class 跟踪数据、父节点以及左右子节点。我的最大堆插入方法需要永远填充 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);
}
}
}`
如果有人在代码中提供建议或告诉我哪里出了问题,我们将不胜感激。
如果您想查看 为什么 您的 findSpot
函数花费了这么长时间,请在开头添加一行输出 "findSpot <node>"
,其中正在搜索的节点的详细信息。你会发现递归算法被调用了很多次。看起来 findHeight
也经常被调用。我不确定,但看起来您正在对每次插入进行详尽的树搜索。
二叉堆必须保持形状属性:它是一个完整的二叉树,除了最下面的一行可能是left-filled。因此,如果知道堆中有多少个节点,就可以轻松找到下一个节点的插入点。考虑这个堆:
1
2 3
4 5 6
堆中有6个节点。每当堆中有 6 个节点时,树将如下所示,下一个节点的插入点将是最右边节点(在本例中为 3)的右子节点。
有趣的是,节点号的二进制表示告诉我们该节点在哪里。比如6在二进制中就是110
。去掉第一个数字 1,剩下 10
。现在,从根开始,取数字中的下一个数字,如果数字为 0,则向左移动;如果数字为 1,则向右移动。然后取下一个数字,执行相同的操作。重复直到你 运行 个数字。
在 6 的情况下,我们将从根向右转到节点 3,然后向左转到节点 6。
添加新节点时,增加计数并按照上述步骤定位插入点。 7 在二进制中是 111
。你砍掉高位,留下 11
。然后,从根开始向右,插入点是节点 3 的右子节点。
当然,一旦你把节点放在树中以满足形状属性,你必须做标准的re-heapify来调整树中的节点,以便堆属性 得到维护。