如何找到存储在由每个值的深度加权的整数二叉树中的值的总和?

时间:2013-10-26 07:17:17

标签: java algorithm data-structures binary-tree binary-search-tree

说明:对于给定的二叉树

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

它似乎不起作用。我知道这个解决方案存在缺陷,但我无法修复它。有帮助吗?建议?

3 个答案:

答案 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。