📌  相关文章
📜  二叉树的奇数级和偶数级节点之和之间的差异

📅  最后修改于: 2022-05-13 01:57:17.581000             🧑  作者: Mango

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

给定一棵二叉树,求奇数层节点总和与偶数层节点总和之间的差。将 root 视为第 1 级,将 root 的左右子节点视为第 2 级,依此类推。
例如,在下面的树中,奇数层的节点总和为 (5 + 1 + 4 + 8),即 18。偶数层的节点总和为 (2 + 6 + 3 + 7 + 9),即 27 . 以下树的输出应该是 18 - 27,即 -9。

5
    /   \
   2     6
 /  \     \  
1    4     8
    /     / \ 
   3     7   9  

一种直接的方法是使用水平顺序遍历。在遍历过程中,检查当前节点的层级,如果是奇数,则按当前节点的数据递增奇数,否则递增偶数。最后返回奇数和偶数之差。有关此方法的实施,请参见下文。
C 实现基于级别顺序遍历的方法来查找差异。
这种方法由 Mandeep Singh 提供。对于迭代方法,只需逐级遍历树(级别顺序遍历),将节点值的总和存储在偶数中。 evenSum 中的水平和变量oddSum 中的其余部分,最后返回差值。
下面是该方法的简单实现。

C++
// CPP program to find
// difference between
// sums of odd level
// and even level nodes
// of binary tree
#include 
using namespace std;
 
// tree node
struct Node
{
    int data;
    Node *left, *right;
};
 
// returns a new
// tree Node
Node* newNode(int data)
{
    Node* temp = new Node();
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}
 
// return difference of
// sums of odd level
// and even level
int evenOddLevelDifference(Node* root)
{
    if (!root)
        return 0;
 
    // create a queue for
    // level order traversal
    queue q;
    q.push(root);
 
    int level = 0;
    int evenSum = 0, oddSum = 0;
 
    // traverse until the
    // queue is empty
    while (!q.empty())
    {
        int size = q.size();
        level += 1;
 
        // traverse for
        // complete level
        while(size > 0)
        {
            Node* temp = q.front();
            q.pop();
 
            // check if level no.
            // is even or odd and
            // accordingly update
            // the evenSum or oddSum
            if(level % 2 == 0)
                evenSum += temp->data;
            else
                oddSum += temp->data;
         
            // check for left child
            if (temp->left)
            {
                q.push(temp->left);
            }
             
            // check for right child
            if (temp->right)
            {
                q.push(temp->right);
            }
            size -= 1;
        }
    }
     
    return (oddSum - evenSum);
}
 
// driver program
int main()
{
    // construct a tree
    Node* root = newNode(5);
    root->left = newNode(2);
    root->right = newNode(6);
    root->left->left = newNode(1);
    root->left->right = newNode(4);
    root->left->right->left = newNode(3);
    root->right->right = newNode(8);
    root->right->right->right = newNode(9);
    root->right->right->left = newNode(7);
 
    int result = evenOddLevelDifference(root);
    cout << "difference between sums is :: ";
    cout << result << endl;
    return 0;
}
 
// This article is contributed by Mandeep Singh.


Java
// Java program to find 
// difference between 
// sums of odd level 
// and even level nodes 
// of binary tree
import java.io.*;
import java.util.*;
// User defined node class
class Node {
      int data;
      Node left, right;
        
      // Constructor to create a new tree node
      Node(int key)
      {
           data  = key;
           left = right = null;
      }
}
class GFG {
      // return difference of
      // sums of odd level  and even level
      static int evenOddLevelDifference(Node root)
      {
             if (root == null)
                 return 0;
 
             // create a queue for
             // level order traversal
             Queue q = new LinkedList<>();
             q.add(root);
 
             int level = 0;
             int evenSum = 0, oddSum = 0;
 
             // traverse until the
             // queue is empty
             while (q.size() != 0) {
                   int size = q.size();
                   level++;
                    
                   // traverse for complete level
                   while (size > 0) {
                          Node temp = q.remove();
 
                          // check if level no.
                          // is even or odd and
                          // accordingly update
                          // the evenSum or oddSum
                          if (level % 2 == 0)
                              evenSum += temp.data;
                          else
                              oddSum += temp.data;
 
                          // check for left child
                          if (temp.left != null)
                              q.add(temp.left);
                            
                          // check for right child
                          if (temp.right != null)
                              q.add(temp.right);
                          size--;
                   }
             }
             return (oddSum - evenSum); 
      }
 
      // Driver code
      public static void main(String args[])
      {
             // construct a tree
             Node root = new Node(5);
             root.left = new Node(2);
             root.right = new Node(6);
             root.left.left = new Node(1);
             root.left.right = new Node(4);
             root.left.right.left = new Node(3);
             root.right.right = new Node(8);
             root.right.right.right = new Node(9);
             root.right.right.left = new Node(7);
 
             System.out.println("difference between sums is " +
                                evenOddLevelDifference(root));
      }
}
// This code is contributed by rachana soma


Python3
# Python3 program to find maximum product
# of a level in Binary Tree
 
# Helper function that allocates a new
# node with the given data and None
# left and right pointers.                                    
class newNode:
 
    # Construct to create a new node
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
 
# return difference of sums of odd
# level and even level
def evenOddLevelDifference(root):
 
    if (not root):
        return 0
 
    # create a queue for
    # level order traversal
    q = []
    q.append(root)
 
    level = 0
    evenSum = 0
    oddSum = 0
 
    # traverse until the queue is empty
    while (len(q)):
     
        size = len(q)
        level += 1
 
        # traverse for complete level
        while(size > 0):
         
            temp = q[0] #.front()
            q.pop(0)
 
            # check if level no. is even or
            # odd and accordingly update
            # the evenSum or oddSum
            if(level % 2 == 0):
                evenSum += temp.data
            else:
                oddSum += temp.data
         
            # check for left child
            if (temp.left) :
             
                q.append(temp.left)
             
            # check for right child
            if (temp.right):
             
                q.append(temp.right)
             
            size -= 1
         
    return (oddSum - evenSum)
 
# Driver Code
if __name__ == '__main__':
     
    """
    Let us create Binary Tree shown
    in above example """
    root = newNode(5)
    root.left = newNode(2)
    root.right = newNode(6)
    root.left.left = newNode(1)
    root.left.right = newNode(4)
    root.left.right.left = newNode(3)
    root.right.right = newNode(8)
    root.right.right.right = newNode(9)
    root.right.right.left = newNode(7)
 
    result = evenOddLevelDifference(root)
    print("Difference between sums is", result)
 
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)


C#
// C# program to find
// difference between
// sums of odd level
// and even level nodes
// of binary tree
using System;
using System.Collections.Generic;
 
// User defined node class
public class Node
{
    public int data;
    public Node left, right;
         
    // Constructor to create a new tree node
    public Node(int key)
    {
        data = key;
        left = right = null;
    }
}
 
public class GFG
{
    // return difference of
    // sums of odd level and even level
    static int evenOddLevelDifference(Node root)
    {
            if (root == null)
                return 0;
 
            // create a queue for
            // level order traversal
            Queue q = new Queue();
            q.Enqueue(root);
 
            int level = 0;
            int evenSum = 0, oddSum = 0;
 
            // traverse until the
            // queue is empty
            while (q.Count != 0)
            {
                int size = q.Count;
                level++;
                     
                // traverse for complete level
                while (size > 0)
                {
                        Node temp = q.Dequeue();
 
                        // check if level no.
                        // is even or odd and
                        // accordingly update
                        // the evenSum or oddSum
                        if (level % 2 == 0)
                            evenSum += temp.data;
                        else
                            oddSum += temp.data;
 
                        // check for left child
                        if (temp.left != null)
                            q.Enqueue(temp.left);
                             
                        // check for right child
                        if (temp.right != null)
                            q.Enqueue(temp.right);
                        size--;
                }
            }
            return (oddSum - evenSum);
    }
 
    // Driver code
    public static void Main(String []args)
    {
            // construct a tree
            Node root = new Node(5);
            root.left = new Node(2);
            root.right = new Node(6);
            root.left.left = new Node(1);
            root.left.right = new Node(4);
            root.left.right.left = new Node(3);
            root.right.right = new Node(8);
            root.right.right.right = new Node(9);
            root.right.right.left = new Node(7);
 
            Console.WriteLine("difference between sums is " +
                                evenOddLevelDifference(root));
    }
}
 
// This code is contributed by 29AjayKumar


Javascript


C++
// A recursive program to find difference
// between sum of nodes at odd level
// and sum at even level
#include 
using namespace std;
 
// Binary Tree node
class node
{
    public:
    int data;
    node* left, *right;
};
 
// A utility function to allocate
// a new tree node with given data
node* newNode(int data)
{
    node* Node = new node();
    Node->data = data;
    Node->left = Node->right = NULL;
    return (Node);
}
 
// The main function that return
// difference between odd and even
// level nodes
int getLevelDiff(node *root)
{
// Base case
if (root == NULL)
        return 0;
 
// Difference for root is root's data - difference for
// left subtree - difference for right subtree
return root->data - getLevelDiff(root->left) -
                    getLevelDiff(root->right);
}
 
// Driver code
int main()
{
    node *root = newNode(5);
    root->left = newNode(2);
    root->right = newNode(6);
    root->left->left = newNode(1);
    root->left->right = newNode(4);
    root->left->right->left = newNode(3);
    root->right->right = newNode(8);
    root->right->right->right = newNode(9);
    root->right->right->left = newNode(7);
    cout<


C
// A recursive program to find difference between sum of nodes at
// odd level and sum at even level
#include 
#include 
 
// Binary Tree node
struct node
{
    int data;
    struct node* left, *right;
};
 
// A utility function to allocate a new tree node with given data
struct node* newNode(int data)
{
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left =  node->right = NULL;
    return (node);
}
 
// The main function that return difference between odd and even level
// nodes
int getLevelDiff(struct node *root)
{
   // Base case
   if (root == NULL)
         return 0;
 
   // Difference for root is root's data - difference for
   // left subtree - difference for right subtree
   return root->data - getLevelDiff(root->left) -
                                         getLevelDiff(root->right);
}
 
// Driver program to test above functions
int main()
{
    struct node *root = newNode(5);
    root->left = newNode(2);
    root->right = newNode(6);
    root->left->left  = newNode(1);
    root->left->right = newNode(4);
    root->left->right->left = newNode(3);
    root->right->right = newNode(8);
    root->right->right->right = newNode(9);
    root->right->right->left = newNode(7);
    printf("%d is the required difference\n", getLevelDiff(root));
    getchar();
    return 0;
}


Java
// A recursive java program to find difference between sum of nodes at
// odd level and sum at even level
  
// A binary tree node
class Node
{
    int data;
    Node left, right;
  
    Node(int item)
    {
        data = item;
        left = right;
    }
}
  
class BinaryTree
{
    // The main function that return difference between odd and even level
    // nodes
    Node root;
  
    int getLevelDiff(Node node)
    {
        // Base case
        if (node == null)
            return 0;
 
        // Difference for root is root's data - difference for
        // left subtree - difference for right subtree
        return node.data - getLevelDiff(node.left) -
                                              getLevelDiff(node.right);
    }
  
    // Driver program to test above functions
    public static void main(String args[])
    {
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(5);
        tree.root.left = new Node(2);
        tree.root.right = new Node(6);
        tree.root.left.left = new Node(1);
        tree.root.left.right = new Node(4);
        tree.root.left.right.left = new Node(3);
        tree.root.right.right = new Node(8);
        tree.root.right.right.right = new Node(9);
        tree.root.right.right.left = new Node(7);
        System.out.println(tree.getLevelDiff(tree.root) + 
                                             " is the required difference");
  
    }
}
  
// This code has been contributed by Mayank Jaiswal


Python3
# A recursive program to find difference between sum of nodes
# at odd level and sum at even level
 
# A Binary Tree node
class Node:
 
    # Constructor to create a new node
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
# The main function that returns difference between odd and
# even level nodes
def getLevelDiff(root):
 
    # Base Case
    if root is None:
        return 0
 
    # Difference for root is root's data - difference for
    # left subtree - difference for right subtree
    return (root.data - getLevelDiff(root.left)-
        getLevelDiff(root.right))
 
# Driver program to test above function
root = Node(5)
root.left = Node(2)
root.right = Node(6)
root.left.left = Node(1)
root.left.right = Node(4)
root.left.right.left = Node(3)
root.right.right = Node(8)
root.right.right.right = Node(9)
root.right.right.left = Node(7)
print ("%d is the required difference" %(getLevelDiff(root)))
 
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)


C#
using System;
 
// A recursive C# program to find
// difference between sum of nodes at
// odd level and sum at even level
 
// A binary tree node
public class Node
{
    public int data;
    public Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right;
    }
}
 
public class BinaryTree
{
    // The main function that return difference
    // between odd and even level nodes
    public Node root;
 
    public virtual int getLevelDiff(Node node)
    {
        // Base case
        if (node == null)
        {
            return 0;
        }
 
        // Difference for root is root's
        // data - difference for left subtree
        //  - difference for right subtree
        return node.data - getLevelDiff(node.left)
                        - getLevelDiff(node.right);
    }
 
    // Driver program to test above functions
    public static void Main(string[] args)
    {
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(5);
        tree.root.left = new Node(2);
        tree.root.right = new Node(6);
        tree.root.left.left = new Node(1);
        tree.root.left.right = new Node(4);
        tree.root.left.right.left = new Node(3);
        tree.root.right.right = new Node(8);
        tree.root.right.right.right = new Node(9);
        tree.root.right.right.left = new Node(7);
        Console.WriteLine(tree.getLevelDiff(tree.root)
                        + " is the required difference");
 
    }
}
 
// This code is contributed by Shrikant13


Javascript


输出:

difference between sums is -9

该问题也可以使用简单的递归遍历来解决。我们可以递归地计算所需的差异,即根数据的值减去左孩子下的子树的差和右孩子下的子树的差。
下面是这种方法的实现。

C++

// A recursive program to find difference
// between sum of nodes at odd level
// and sum at even level
#include 
using namespace std;
 
// Binary Tree node
class node
{
    public:
    int data;
    node* left, *right;
};
 
// A utility function to allocate
// a new tree node with given data
node* newNode(int data)
{
    node* Node = new node();
    Node->data = data;
    Node->left = Node->right = NULL;
    return (Node);
}
 
// The main function that return
// difference between odd and even
// level nodes
int getLevelDiff(node *root)
{
// Base case
if (root == NULL)
        return 0;
 
// Difference for root is root's data - difference for
// left subtree - difference for right subtree
return root->data - getLevelDiff(root->left) -
                    getLevelDiff(root->right);
}
 
// Driver code
int main()
{
    node *root = newNode(5);
    root->left = newNode(2);
    root->right = newNode(6);
    root->left->left = newNode(1);
    root->left->right = newNode(4);
    root->left->right->left = newNode(3);
    root->right->right = newNode(8);
    root->right->right->right = newNode(9);
    root->right->right->left = newNode(7);
    cout<

C

// A recursive program to find difference between sum of nodes at
// odd level and sum at even level
#include 
#include 
 
// Binary Tree node
struct node
{
    int data;
    struct node* left, *right;
};
 
// A utility function to allocate a new tree node with given data
struct node* newNode(int data)
{
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left =  node->right = NULL;
    return (node);
}
 
// The main function that return difference between odd and even level
// nodes
int getLevelDiff(struct node *root)
{
   // Base case
   if (root == NULL)
         return 0;
 
   // Difference for root is root's data - difference for
   // left subtree - difference for right subtree
   return root->data - getLevelDiff(root->left) -
                                         getLevelDiff(root->right);
}
 
// Driver program to test above functions
int main()
{
    struct node *root = newNode(5);
    root->left = newNode(2);
    root->right = newNode(6);
    root->left->left  = newNode(1);
    root->left->right = newNode(4);
    root->left->right->left = newNode(3);
    root->right->right = newNode(8);
    root->right->right->right = newNode(9);
    root->right->right->left = newNode(7);
    printf("%d is the required difference\n", getLevelDiff(root));
    getchar();
    return 0;
}

Java

// A recursive java program to find difference between sum of nodes at
// odd level and sum at even level
  
// A binary tree node
class Node
{
    int data;
    Node left, right;
  
    Node(int item)
    {
        data = item;
        left = right;
    }
}
  
class BinaryTree
{
    // The main function that return difference between odd and even level
    // nodes
    Node root;
  
    int getLevelDiff(Node node)
    {
        // Base case
        if (node == null)
            return 0;
 
        // Difference for root is root's data - difference for
        // left subtree - difference for right subtree
        return node.data - getLevelDiff(node.left) -
                                              getLevelDiff(node.right);
    }
  
    // Driver program to test above functions
    public static void main(String args[])
    {
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(5);
        tree.root.left = new Node(2);
        tree.root.right = new Node(6);
        tree.root.left.left = new Node(1);
        tree.root.left.right = new Node(4);
        tree.root.left.right.left = new Node(3);
        tree.root.right.right = new Node(8);
        tree.root.right.right.right = new Node(9);
        tree.root.right.right.left = new Node(7);
        System.out.println(tree.getLevelDiff(tree.root) + 
                                             " is the required difference");
  
    }
}
  
// This code has been contributed by Mayank Jaiswal

Python3

# A recursive program to find difference between sum of nodes
# at odd level and sum at even level
 
# A Binary Tree node
class Node:
 
    # Constructor to create a new node
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
# The main function that returns difference between odd and
# even level nodes
def getLevelDiff(root):
 
    # Base Case
    if root is None:
        return 0
 
    # Difference for root is root's data - difference for
    # left subtree - difference for right subtree
    return (root.data - getLevelDiff(root.left)-
        getLevelDiff(root.right))
 
# Driver program to test above function
root = Node(5)
root.left = Node(2)
root.right = Node(6)
root.left.left = Node(1)
root.left.right = Node(4)
root.left.right.left = Node(3)
root.right.right = Node(8)
root.right.right.right = Node(9)
root.right.right.left = Node(7)
print ("%d is the required difference" %(getLevelDiff(root)))
 
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)

C#

using System;
 
// A recursive C# program to find
// difference between sum of nodes at
// odd level and sum at even level
 
// A binary tree node
public class Node
{
    public int data;
    public Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right;
    }
}
 
public class BinaryTree
{
    // The main function that return difference
    // between odd and even level nodes
    public Node root;
 
    public virtual int getLevelDiff(Node node)
    {
        // Base case
        if (node == null)
        {
            return 0;
        }
 
        // Difference for root is root's
        // data - difference for left subtree
        //  - difference for right subtree
        return node.data - getLevelDiff(node.left)
                        - getLevelDiff(node.right);
    }
 
    // Driver program to test above functions
    public static void Main(string[] args)
    {
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(5);
        tree.root.left = new Node(2);
        tree.root.right = new Node(6);
        tree.root.left.left = new Node(1);
        tree.root.left.right = new Node(4);
        tree.root.left.right.left = new Node(3);
        tree.root.right.right = new Node(8);
        tree.root.right.right.right = new Node(9);
        tree.root.right.right.left = new Node(7);
        Console.WriteLine(tree.getLevelDiff(tree.root)
                        + " is the required difference");
 
    }
}
 
// This code is contributed by Shrikant13

Javascript


输出:

-9 is the required difference

两种方法的时间复杂度都是O(n),但第二种方法简单易实现。