偶数节点和奇数节点之和的二叉树差异

时间:2012-11-16 18:00:29

标签: java binary-tree

如何编写函数来返回奇数高度处节点值之和与偶数高度处节点值之和的差值。考虑根节点在二叉树的高度为1

输入

                                      1
                              2                3
                          4        5       6        7
                      8     9  10    11  12  13   14  15

输出:-74说明:

[ (1 + 4 + 5 + 6 + 7 ) - (2 + 3 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15) = -74 ]

代码:

public static int diff(Node n) {
    if (n == null)
        return 0;
    return Sum(n) - Sum(n.left) - Sum(n.right);

}
public static int Sum(Node root) {
    int sum = 0;
    if (root == null) {
        return sum;
    }
    sum = sum + root.data;
    if (root.left != null) {
        sum = sum + Sum(root.left.left) + Sum(root.left.right);
    }
    if (root.right != null) {
        sum = sum + Sum(root.right.left) + Sum(root.right.right);
    }
    return sum;
}

我已经给出了这个解决方案,但没有选择...我不知道这是什么问题。

6 个答案:

答案 0 :(得分:3)

public static int Sum(Node root) {

    if (root == null) {
        return 0;
    }
    return root.data-Sum(root.left)-Sum(root.right);
}

这是我找到解决方案最简单,最智能的方式

答案 1 :(得分:2)

这里使用简短的recusrsion来解释解决方案..

取消当前节点下的所有级别(当前节点的级别),并在递归的每一步执行此操作。

sum[l1] – (sum[l2] – (sum[l3] – (sum[l4] – … = sum[l1] – sum[l2] + sum[l3] – sum[l4]…

www.crazyforcode.com/binary-tree-diff-sum-even-nodes-sum-odd-nodes /

答案 2 :(得分:1)

怎么样......

public static int diff(Node n) {
    return sumtree(Node n, 1);
}

public static int sumtree(Node n, int level) {

   if (n == null) return 0;

   if (level % 2 == 0) { 
      return sumtree(n.left, level + 1) + sumtree(n.right, level +1 ) - n.value;
   } else {
      return sumtree(n.left, level + 1) + sumtree(n.right, level + 1) + n.value;
   }
}

在奇数级数字上添加值(1,3,5 7 ...),在偶数上减去(2,4,6,8 ...)。

答案 3 :(得分:0)

在你的代码中:

if (root.left != null) {
        sum = sum + Sum(root.left.left) + Sum(root.left.right);
    }
    if (root.right != null) {
        sum = sum + Sum(root.right.left) + Sum(root.right.right);
    }

您应该区分奇数级别和偶数级别。目前,您只是多次汇总所有数字。

如果您在2个不同的功能(效率不高)中解决问题,您可以更轻松地完成此任务

// Method to calculate the even or odd depending on the flag
public static int even_odd (Node n, int level, int flag)
{
    int value = 0;
    if (n == null) return 0;

    if(level % 2 == 0 && flag == 0 ||  level % 2 != 0 && flag == 1) 
       value = n.value;

   return value + even_odd(n.left,level+1,flag) + even_odd(n.right,level+1,flag);

   return 0;
}

产生差异的方法:

public static int dif (Node n)
    {
      return even_odd(n,1,0) - even_odd(n,1,1);
   }

说明:

您必须遍历整个树并验证当前级别是否为奇数,因此对于每次递归调用,您都会增加变量级别以跟踪您所处的级别。

flag = 0表示您要搜索偶数,标志= 1表示您想要奇数。最后,该方法将返回符合条件的所有数字的总和(奇数或偶数)。

之后,您可以瞄准更强大的方法,在单次行程中计算偶数和奇数级别。为此,我建议使用迭代方法。

答案 4 :(得分:0)

我采取的方法是首先找到添加所有叶子的方法,然后添加一个“级别因子”,如果级别是你添加的,否则你减去。这看起来可能与其他类似,但我发现它更清洁。

在ANSI C上

int diffOddAndEven(Node *root)
{
    return sumLevel(root, 0);
}

int sumLevel(Node *root, int level)
{
    int sum=0;
    int levelFactor = level%2 ? -1 : 1;

    if(!root)
        return 0;

    sum = root->value * levelFactor;

    sum += sumLevel(root->left, level+1);
    sum += sumLevel(root->right, level+1);

    return sum;
}

答案 5 :(得分:0)

查看我的解决方案

traverse(root,1);  //1 is passed since we want oddlevelsum - evenlevelsum,pass -1 for opposite

int traverse(Tree* root,int level){

    if(root==NULL)return 0;
    return (level*root->data)+ traverse(level*-1,root->left_node)
       + traverse(level*-1,root->right_node);

}