好的,我得到了一堆叶子10,9,7,8,我需要从它们创建一个总和树
我需要找到圈出的内容的总和。
问题实际上是一个重量问题,我可以一次选择两个元素来添加它们,它们的组合重量是组合元素所做的工作,我必须继续这样做,直到所有权重组合在一起做最小的工作量,但我把它变成了这个,因为我认为这是解决它的方法。
这是解决这个问题的最佳方法还是有更好的方法?
创建此树并计算这些节点总和的最快方法是什么?
答案 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)
给定从叶子构建的任何二叉树,每个叶子对总工作/成本贡献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()));
}