这是java中没有使用数组的Heap的实现但是我在插入数据时有一些问题,例如当我插入1,3,2,5,8时它插入5,8两次作为子树3和另一个作为2的子树。
public class Heap {
private class Node {
private Node left, right,parent;
private int key;
private Node(int key) {
this.key = key;
}
}
private Node root;
public void insert(int key) {
root = insert(root,key,null);
}
private Node insert(Node x, int key,Node parent) {
if(x == null){
x = new Node(key);
x.parent = parent;
return x;
}if(x.left == null){
x.left = insert(x.left, key,x);
}else if (x.right == null) {
x.right = insert(x.right, key,x);
}else{
x.left = insert(x.left, key,x);
x.right = insert(x.right, key,x);
}
return x;
}
}
答案 0 :(得分:0)
问题是
x.left = insert(x.left, key,x);
x.right = insert(x.right, key,x);
你只是插入两个子堆......
这不是堆的工作方式......
答案 1 :(得分:0)
else {
x.left = insert(x.left, key, x);
x.right = insert(x.right, key, x);
}
将密钥插入x的两个子树中。
你必须决定采取哪个分支,例如通过比较密钥到x的密钥,并使用右分支key >= x.key
,否则采用左分支(如果正确完成,你将得到一个有序的树),或采取最小的分支 - x的树。