如何创建叶节点然后构建一棵树

时间:2013-11-27 20:47:38

标签: java tree priority-queue

我按顺序增加了一个整数优先级队列。

我现在需要按递增顺序为此优先级队列中的每个术语创建一个叶节点。然后,我需要使用这些叶子节点来创建一个树,方法是取前两个项的总和,并用叶子节点替换它们的总和,依此类推。

例如,如果叶节点是{1,2,3,4,5},那么,由于1 + 2 = 3,新的叶节点集应为{3,3,4,5},其中3分别是左右儿童1和2。然后,由于3 + 3 + 6,新的叶节点集应该是{4,5,6},其中6分别具有左和右子3和3。然后,由于4 + 5 = 9,新的叶节点集应该是{6,9},其中9分别具有左和右子4和5。然后,由于6 + 9 = 15,新的叶子节点集应为{15},其中15个左右儿童分别为6和9。

请帮助我了解如何在Java中解决这个问题。谢谢。

3 个答案:

答案 0 :(得分:1)

Java是一种OOP语言,这意味着您必须编写“食谱”(称为类)才能创建事物(叶节点,树,任何......)。

树的标准方式如下:

class Tree{

    class LeafNode{

        LeafNode children[];
        String data;        //data could be any Object or Generic

        LeafNode(int childrenNumber, String d){
            data = d;
            children = new LeafNode[childrenNumber];
        }
    }


  LeafNode root;

/*
 *  There can be the class Tree Constructor and put-get functions
 */

}

你提到的叶子成语可以用put方法实现。

答案 1 :(得分:0)

首先必须编写Leaf课程:

public class Leaf {

    public int value = 0;
    public Leaf left = null;
    public Leaf right = null;

    public Leaf(int value) {
    this.value = value;
    }

    public String toString() {
    return "[" + value + ", left: " + left + ", right: " + right + "]";
    }
}

然后你必须实现你的算法。这样的事情应该有效:

static void doIt(List<Leaf> leaves) {

    if (leaves.size() == 1) {
        return;
    }
    Leaf head = leaves.get(0);
    Leaf next = leaves.get(1);
    Leaf sum = new Leaf(head.value + next.value);

    sum.left = head;
    sum.right = next;
    leaves.set(0, sum);
    leaves.remove(1);

    sortLeaves(leaves);
    doIt(leaves);
    }

    static void sortLeaves(List<Leaf> leaves) {
    Collections.sort(leaves, new Comparator<Leaf>() {
        @Override
        public int compare(Leaf o1, Leaf o2) {
        return o1.value - o2.value;
        }
    });
    }

答案 2 :(得分:0)

这是我记得的数据结构

public class Tree
{

    //constructors and stuff

    private class BSTNode<T>
    {
        //constructors and stuff

        private T data;
        private BSTNode<T> left, right;
    }


}

我记得使用树时,节点类始终是更大树类的私有内部类。确定的逻辑是叶子可能是这样的东西。

public boolean isLeaf()
{
    return (left == null) && (right == null);
}

如果节点没有任何子节点,那么它就是一个叶子。