【问题标题】:Setting parents in tree在树中设置父母
【发布时间】:2013-04-17 05:46:54
【问题描述】:

我有一棵以空节点 a 开头的霍夫曼二叉树。

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;
}

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

【问题讨论】:

    标签: java tree binary-tree huffman-code


    【解决方案1】:

    对您的代码有帮助的一些 cmets

    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

         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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多