从树叶创建一个总和树

时间:2012-04-28 21:39:53

标签: java tree binary-tree

好的,我得到了一堆叶子10,9,7,8,我需要从它们创建一个总和树 enter image description here

我需要找到圈出的内容的总和。

问题实际上是一个重量问题,我可以一次选择两个元素来添加它们,它们的组合重量是组合元素所做的工作,我必须继续这样做,直到所有权重组合在一起做最小的工作量,但我把它变成了这个,因为我认为这是解决它的方法。

这是解决这个问题的最佳方法还是有更好的方法?

创建此树并计算这些节点总和的最快方法是什么?

3 个答案:

答案 0 :(得分:0)

使用stack machine。推叶子直到堆叠有2个元素。弹出这些元素,添加(sub,mult,div等)它们,并推送结果。一直这样做,直到输入没有更多的元素。最终结果是在堆栈顶部。该算法按照和树所做的算法进行算术运算。

code                stack
--------------------------
push 10             10$        
push 9              9, 10$     

pop a               10$
pop b               $
push a+b            19$

push 7              7, 19$
push 8              8, 7, 19$

pop a               7, 19$
pop b               19$
push a+b            15, 19$

pop a               19$
pop b               $
push a+b            34$

done                34$ 

答案 1 :(得分:0)

贪婪的解决方案:

  1. 将所有叶子放入优先级队列(最小重量首先出现)。
  2. 当队列包含多个树时,拉出两个最小权重树,连接它们并将关节树插入队列。
  3. 当队列只包含一棵树时,这就是您的解决方案。
  4. 贪婪的解决方案有效:

    给定从叶子构建的任何二叉树,每个叶子对总工作/成本贡献depth*weight。 (叶子的深度是从根到叶子的路径长度,例如

       18
      /  \
      3   15
    /  \ /  \
    1  2 4  11
           / \
           5  6
    

    叶子1,2和4的深度为2,叶子5和6的深度为3。)

    因此,对于任何给定形状的树,当最轻的叶子最深时,获得最小的总成本。因此,当第一步将两个最轻的叶子连接到一棵新树时,就会达到最低成本树。

    当一些树叶已经加入时,建造树木的总成本是(成本到目前为止)+(建造最便宜树木的成本,将非单一树木视为树叶)。

    因此,在最低成本树中,通过上述推理,两个最轻的“叶子”必须处于最深层,因此可以连接形成一个新的子树。

答案 2 :(得分:0)

以下是使用Java

的实现
public static int sumTree(BinaryTreeNode<Integer> node) {
    if (node == null) {
        return 0;
    }
    int oldVal = node.getData();
    node.setData(sumTree(node.getLeft()) + sumTree(node.getRight()));

    return oldVal + node.getData();
}

以下是测试用例

@Test
public void sumTreeTest() {
    BinaryTreeNode<Integer> bt = BinaryTreeUtil.<Integer>fromInAndPostOrder(new Integer[]{8,-2,-4,10,7,6,5}, new Integer[]{8,-4,-2,7,5,6,10});
    BinaryTreeUtil.sumTree(bt);
    List<Integer> result = new ArrayList<Integer>();
    BinaryTreeUtil.printInOrder(bt, result);
    assertThat(result.toArray(new Integer[0]), equalTo(new Integer[]{0, 4, 0, 20, 0, 12, 0}));
    //System.out.println(Arrays.toString(result.toArray()));
}