使用递归获取二叉树的左叶总和

时间:2016-11-08 22:25:37

标签: binary-tree tree-traversal

我有以下代码,但此代码中似乎存在问题:

private boolean isLeaf(TreeNode node) {
    if (node == null)
        return false;
    if (node.left == null && node.right == null)
        return true;
    return false;
}

public int sumOfLeftLeaves(TreeNode root) {
    if (root == null)
        return 0;
    if (isLeaf(root.left))
        return root.left.val;
    return sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right);
}

对于输入[3, 9, 20, null, null, 15, 7, 2, null, null, null, 3, 2, null, null, null, 3],我使用上面的代码获得9,但答案应为12,即9 + 3

此代码缺少什么?

输入数组表示二叉树,如果父项位于i位置,则其左侧子项位于2 * i + 1且右侧子项位于2 * i + 2

2 个答案:

答案 0 :(得分:0)

第一个问题:

[3, 9, 20, null, null, 15, 7, 2, null, null, null, 3, 2, null, null, null, 3]

3是根,它有9个和20个孩子。 9没有孩子,20岁有15岁和7岁。 2属于哪里?

这是Ruby中的树:

Node (0) : 3
    Node (2) : 20
        Node (6) : 7
            Node (14) : nil
            Node (13) : nil
        Node (5) : 15
            Node (12) : 2
            Node (11) : 3
    Node (1) : 9
        Node (4) : nil
            Node (10) : nil
            Node (9) : nil
        Node (3) : nil
            Node (8) : nil
            Node (7) : 2
                Node (16) : 3
                Node (15) : nil

第二个问题:

节点左边可能有一片叶子,右边有一个分支:

public int sumOfLeftLeaves(TreeNode root) {
    if (root == null)
        return 0;
    if (isLeaf(root.left))
        return root.left.val+sumOfLeftLeaves(root.right);
    return sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right);
}

答案 1 :(得分:0)

维护一个求和变量,该变量实际将节点的值相加。

    if(!root)
        return 0;
    
    if(root->left && root->left->left == NULL && root->left->right == NULL) //checking for leaf
        sum += root->left->val;
    
    sum += (sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right));
    return sum;