Java 如何找到存储在二叉整数树中的值之和,该二叉整数树根据每个值的深度进行加权?

Java 如何找到存储在二叉整数树中的值之和,该二叉整数树根据每个值的深度进行加权?,java,algorithm,data-structures,binary-tree,binary-search-tree,Java,Algorithm,Data Structures,Binary Tree,Binary Search Tree,说明:对于给定的二叉树 +---+ | 9 | +---+ / \ +---+ +---+ | 7 | | 6 | +---+ +---+ / \ \ +---+ +---+ +---+ | 3 | | 2 | |

说明:对于给定的二叉树

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

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

获取提示。。在树上执行DFS遍历。然后对每个深度求和节点的值,并乘以深度+1。

主要问题是,一旦开始向左移动,就会一直向左移动。你从不看左孩子的右孩子,反之亦然

您可以使用一个函数计算加权和,该函数同时接受节点及其级别。这将极大地简化实现,使其更容易正确

下面是一个近似实现(我还没有测试):


我把它作为一个练习,以了解如何为根节点调用它。

只需从根开始,并初始化级别=1

sum = root.key()*level + weightedSum( root.left(), level + 1 ) + weightedSum( root.right(), level + 1 );

调用level=1的根节点,当我们向下移动时,向上移动level+1。您的解决方案简洁而优雅:-)
sum = root.key()*level + weightedSum( root.left(), level + 1 ) + weightedSum( root.right(), level + 1 );