【问题标题】:Binary Tree diff of sum of nodes at odd and sum of nodes at even奇数节点总和和偶数节点总和的二叉树差异
【发布时间】:2018-10-13 18:01:34
【问题描述】:

如何编写函数来返回奇数高度节点的值之和与偶数高度节点的值之和的差。考虑到二叉树的根节点高度为 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;
}

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

【问题讨论】:

  • @KDiTraglia - 看起来很像 Java。

标签: java binary-tree


【解决方案1】:
public static int Sum(Node root) {

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

这是我找到解决方案的最简单和最聪明的方法

【讨论】:

    【解决方案2】:

    这里的解决方案简而言之使用recurssion来解释..

    否定当前层(当前节点的层)下的所有层,然后在递归的每一步都这样做。

    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/

    【讨论】:

      【解决方案3】:

      怎么样...

      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...)。

      【讨论】:

        【解决方案4】:

        我采用的方法是首先找到一种添加所有叶子的方法,然后添加一个“级别因子”,如果级别是你添加的,否则你减去。这可能看起来与其他人相似,但我觉得它更干净。

        在 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】:

          看看我的解决方案

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

          【讨论】:

            猜你喜欢
            • 2021-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多