说明:对于给定的二叉树
+---+
| 9 |
+---+
/ \
+---+ +---+
| 7 | | 6 |
+---+ +---+
/ \ \
+---+ +---+ +---+
| 3 | | 2 | | 4 |
+---+ +---+ +---+
/ \
+---+ +---+
| 5 | | 2 |
+---+ +---+
总和将计算为:
1 * 9 + 2 *(7 + 6)+ 3 *(3 + 2 + 4)+ 4 *(5 + 2)= 90
我解决这个问题的方法是找到每个节点的级别,将其与节点的密钥相乘,并对左右子树中的所有节点进行递归处理。
int weightedSumAtAllLevels(BTNode node) {
if (node != null)
return levelSumOfLeftSubTree(node.getLeftChild())
+ levelSumOfRightSubTree(node.getRightChild())
+ node.getKey();
else
return 0;
}
int levelSumOfLeftSubTree(BTNode tmp) {
if (tmp == null) {
return 0;
} else {
int level = levelOfNode(tmp);
return level * tmp.getKey()
+ levelSumOfLeftSubTree(tmp.getLeftChild());
}
}
int levelSumOfRightSubTree(BTNode tmp) {
if (tmp == null) {
return 0;
} else {
int level = levelOfNode(tmp);
return level * tmp.getKey()
+ levelSumOfRightSubTree(tmp.getRightChild());
}
}
int levelOfNode(BTNode node) {
if (node == null)
return 0;
else
return 1 + levelOfNode(node.getParent());
}
它似乎不起作用。我知道这个解决方案存在缺陷,但我无法修复它。有帮助吗?建议?
答案 0 :(得分:2)
主要问题是,一旦你开始向左走,你就会向左走。你永远不会看到左孩子的正确孩子,反之亦然。
您可以使用单个函数计算加权和,该函数节点及其级别。这将极大地简化实施,使其更容易正确。
这是一个近似的实现(我没有测试过):
int weightedSumAtAllLevels(BTNode node, int level) {
if (node != null) {
return level * node.getKey() +
weightedSumAtAllLevels(node.getLeftChild(), level + 1) +
weightedSumAtAllLevels(node.getRightChild(), level + 1);
} else {
return 0;
}
}
我把它留作练习来弄清楚应该如何为根节点调用它。
答案 1 :(得分:1)
从root开始并初始化level = 1.
sum = root.key()*level + weightedSum( root.left(), level + 1 ) + weightedSum( root.right(), level + 1 );
答案 2 :(得分:0)
提示..在树上进行DFS遍历。然后对每个深度求和节点的值并乘以深度+ 1。