最大的节点堆java

时间:2018-03-29 07:23:09

标签: java heap nodes max-heap

我目前需要实现最大节点堆,其中我的节点类跟踪数据,父节点,然后是左右子节点。我的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);
        }
    }
}`

如果有人提供建议或告诉我哪些错误,我们将非常感激。

1 个答案:

答案 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属性,就必须执行标准的重堆积来调整树中的节点,以便保持堆属性。