在树中设置父母

时间:2013-04-17 05:46:54

标签: java tree binary-tree huffman-code

我有一个以空节点a。

开头的霍夫曼二叉树

指向左节点和右节点,指向左节点和右节点。有这个树后,是否可以递归地为每个节点设置父节点?

这是我想的代码:

public Node setParents(Node n)
{
    if(n.getZero() == null && n.getOne() == null)
    {
        return n;
    }
    Node a = setParents(n.getZero()); // Zero being left
    a.setParent(n);
    Node b = setParents(n.getOne()); // One being right.
    b.setParent(n);
}

以下是我当前使用优先级队列创建树的方法,其中值排序最小到最大。

public Node createTree(PriorityQueue<Node> pq)
{

    while(pq.size() > 1)
    {
        Node n = new Node();

        Node a = pq.poll();
        if(pq.size() > 0)
        {
            Node b = pq.poll();
            n = new Node(a.getFrequency() + b.getFrequency());
            n.setZero(a);
            a.setWhich(0);
            a.setParent(n);
            n.setOne(b);
            b.setWhich(1);
            b.setParent(n);
        }
        else
        {
            n = new Node(a.getFrequency());
            n.setZero(a);
            a.setWhich(0);
            n.setParent(n);
            n.setOne(null);
        }
        pq.add(n);
    }
    Node n = pq.poll();
    n.setParent(null);
    setParents(n.getZero());
    setParents(n.getOne());
    return n;
}

我只需要确保每个节点都有一个父节点,我不知道从哪里开始..有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

对您的代码提出一些可能有帮助的评论

1。不要在研究样本中使用getter和setter进行简单的分配和读取,这些很难理解。

2。如果您准备了一些物品,请不要将此制剂与其他物品混合

        n.setZero(a);
        a.setWhich(0);
        a.setParent(n);
        n.setOne(b);

3。根据我的理解,有机会获得NPE

          if(pq.size() > 0) {
              Node b = pq.poll();
          }
     }
     Node n = pq.poll();
     n.setParent(null);      <-  n can be null

4。 Java有很好的功能,称为Enums for this

     a.setWhich(0);
     b.setWhich(1);

以下是如何从根

开始设置父项
public void fixParents(Node parentNode)
{
    if (parentNode.zero != null) {
        parentNode.zero.parent = parentNode;
        fixParents(parentNode.zero);
    }
    if (parentNode.one != null) {
        parentNode.one.parent = parentNode;
        fixParents(parentNode.one);
    }
}

<强> UPD

还有一个想法。您可以在树构建功能中设置父项。因此,您应该检查父母是否正确但不重新设置。

public void checkParents(Node parentNode) throws Exception
{
    if (parentNode.zero != null) {
        if (parentNode.zero.parent != parentNode) {
            throw new Exception( here include info about the parentNode.zero );
        }
        checkParents(parentNode.zero);
    }
    if (parentNode.one != null) {
        if (parentNode.one.parent != parentNode) {
            throw new Exception( here include info about the parentNode.one );
        }
        checkParents(parentNode.one);
    }
}