📜  在二叉树中查找最高级别的产品

📅  最后修改于: 2021-04-28 16:50:02             🧑  作者: Mango

给定一个具有正负节点的二叉树,任务是在其中找到最大乘积级别。

例子:

Input :               4
                    /   \
                   2    -5
                  / \    /\
                -1   3 -2  6
Output: 36
Explanation :
Product of all nodes of 0'th level is 4
Product of all nodes of 1'th level is -10
Product of all nodes of 0'th level is 36
Hence maximum product is 6

Input :          1
               /   \
              2     3
             / \     \
            4   5     8
                     /  \
                    6    7  
Output :  160
Explanation :
Product of all nodes of 0'th level is 1
Product of all nodes of 1'th level is 6
Product of all nodes of 0'th level is 160
Product of all nodes of 0'th level is 42
Hence maximum product is 160

先决条件:二叉树的最大宽度

方法:想法是进行树的级别顺序遍历。在遍历时,分别处理不同级别的节点。对于每个要处理的级别,计算级别中节点的乘积并跟踪最大乘积。

C++
// A queue based C++ program to find maximum product
// of a level in Binary Tree
#include 
using namespace std;
  
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct Node {
    int data;
    struct Node *left, *right;
};
  
// Function to find the maximum product of a level in tree
// using level order traversal
int maxLevelProduct(struct Node* root)
{
    // Base case
    if (root == NULL)
        return 0;
  
    // Initialize result
    int result = root->data;
  
    // Do Level order traversal keeping track of number
    // of nodes at every level.
    queue q;
    q.push(root);
    while (!q.empty()) {
  
        // Get the size of queue when the level order
        // traversal for one level finishes
        int count = q.size();
  
        // Iterate for all the nodes in the queue currently
        int product = 1;
        while (count--) {
  
            // Dequeue an node from queue
            Node* temp = q.front();
            q.pop();
  
            // Multiply this node's value to current product.
            product = product * temp->data;
  
            // Enqueue left and right children of
            // dequeued node
            if (temp->left != NULL)
                q.push(temp->left);
            if (temp->right != NULL)
                q.push(temp->right);
        }
  
        // Update the maximum node count value
        result = max(product, result);
    }
  
    return result;
}
  
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct Node* newNode(int data)
{
    struct Node* node = new Node;
    node->data = data;
    node->left = node->right = NULL;
    return (node);
}
  
// Driver code
int main()
{
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
    root->right->right = newNode(8);
    root->right->right->left = newNode(6);
    root->right->right->right = newNode(7);
  
    /* Constructed Binary tree is:
             1
            / \
           2   3
          / \   \
         4   5   8
                / \
               6   7 */
    cout << "Maximum level product is "
         << maxLevelProduct(root) << endl;
    return 0;
}


Java
// A queue based Java program to find 
// maximum product of a level in Binary Tree
import java.util.*;
  
class GFG
{
  
/* A binary tree node has data, 
pointer to left child and a
pointer to right child */
static class Node
{
    int data;
    Node left, right;
};
  
// Function to find the maximum product 
// of a level in tree using 
// level order traversal
static int maxLevelProduct(Node root)
{
    // Base case
    if (root == null)
        return 0;
  
    // Initialize result
    int result = root.data;
  
    // Do Level order traversal keeping track 
    // of number of nodes at every level.
    Queue q = new LinkedList<>();
    q.add(root);
    while (q.size() > 0)
    {
  
        // Get the size of queue when the level order
        // traversal for one level finishes
        int count = q.size();
  
        // Iterate for all the nodes 
        // in the queue currently
        int product = 1;
        while (count-->0) 
        {
  
            // Dequeue an node from queue
            Node temp = q.peek();
            q.remove();
  
            // Multiply this node's value
            // to current product.
            product = product* temp.data;
  
            // Enqueue left and right children of
            // dequeued node
            if (temp.left != null)
                q.add(temp.left);
            if (temp.right != null)
                q.add(temp.right);
        }
  
        // Update the maximum node count value
        result = Math.max(product, result);
    }
    return result;
}
  
/* Helper function that allocates 
a new node with the given data and 
null left and right pointers. */
static Node newNode(int data)
{
    Node node = new Node();
    node.data = data;
    node.left = node.right = null;
    return (node);
}
  
// Driver code
public static void main(String args[])
{
    Node root = newNode(1);
    root.left = newNode(2);
    root.right = newNode(3);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
    root.right.right = newNode(8);
    root.right.right.left = newNode(6);
    root.right.right.right = newNode(7);
  
    /* Constructed Binary tree is:
            1
            / \
        2 3
        / \ \
        4 5 8
                / \
            6 7 */
    System.out.print("Maximum level product is " +
                          maxLevelProduct(root) );
}
}
  
// This code is contributed by Arnub Kundu


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 poers.                                     
class newNode: 
  
    # Construct to create a new node 
    def __init__(self, key): 
        self.data = key
        self.left = None
        self.right = None
  
# Function to find the maximum product 
# of a level in tree using level order
# traversal
def maxLevelProduct(root):
  
    # Base case
    if (root == None):
        return 0
  
    # Initialize result
    result = root.data
  
    # Do Level order traversal keeping track 
    # of number of nodes at every level.
    q = []
    q.append(root)
    while (len(q)): 
  
        # Get the size of queue when the level 
        # order traversal for one level finishes
        count = len(q)
  
        # Iterate for all the nodes in 
        # the queue currently
        product = 1
        while (count):
            count -= 1
              
            # Dequeue an node from queue
            temp = q[0]
            q.pop(0)
  
            # Multiply this node's value to 
            # current product.
            product = product * temp.data
  
            # Enqueue left and right children 
            # of dequeued node
            if (temp.left != None):
                q.append(temp.left)
            if (temp.right != None):
                q.append(temp.right)
          
        # Update the maximum node count value
        result = max(product, result)
      
    return result
  
# Driver Code 
if __name__ == '__main__':
      
    """ 
    Let us create Binary Tree 
    shown in above example """
    root = newNode(1)
    root.left = newNode(2)
    root.right = newNode(3)
    root.left.left = newNode(4)
    root.left.right = newNode(5)
    root.right.right = newNode(8)
    root.right.right.left = newNode(6)
    root.right.right.right = newNode(7)
      
    """ Constructed Binary tree is:
            1
            / \
        2 3
        / \ \
        4 5 8
                / \
            6 7 """
  
    print("Maximum level product is",
               maxLevelProduct(root))
  
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)


C#
// A queue based C# program to find 
// maximum product of a level in Binary Tree 
using System;
using System.Collections.Generic;
  
class GFG 
{
  
    /* A binary tree node has data, 
    pointer to left child and a 
    pointer to right child */
    class Node
    {
        public int data;
        public Node left, right;
    };
  
    // Function to find the maximum product 
    // of a level in tree using 
    // level order traversal 
    static int maxLevelProduct(Node root)
    {
        // Base case 
        if (root == null) 
        {
            return 0;
        }
  
        // Initialize result 
        int result = root.data;
  
        // Do Level order traversal keeping track 
        // of number of nodes at every level. 
        Queue q = new Queue();
        q.Enqueue(root);
        while (q.Count > 0) 
        {
  
            // Get the size of queue when the level order 
            // traversal for one level finishes 
            int count = q.Count;
  
            // Iterate for all the nodes 
            // in the queue currently 
            int product = 1;
            while (count-- > 0) 
            {
  
                // Dequeue an node from queue 
                Node temp = q.Peek();
                q.Dequeue();
  
                // Multiply this node's value 
                // to current product. 
                product = product * temp.data;
  
                // Enqueue left and right children of 
                // dequeued node 
                if (temp.left != null) 
                {
                    q.Enqueue(temp.left);
                }
                if (temp.right != null) 
                {
                    q.Enqueue(temp.right);
                }
            }
  
            // Update the maximum node count value 
            result = Math.Max(product, result);
        }
        return result;
    }
  
    /* Helper function that allocates 
    a new node with the given data and 
    null left and right pointers. */
    static Node newNode(int data)
    {
        Node node = new Node();
        node.data = data;
        node.left = node.right = null;
        return (node);
    }
  
    // Driver code 
    public static void Main(String[] args)
    {
        Node root = newNode(1);
        root.left = newNode(2);
        root.right = newNode(3);
        root.left.left = newNode(4);
        root.left.right = newNode(5);
        root.right.right = newNode(8);
        root.right.right.left = newNode(6);
        root.right.right.right = newNode(7);
  
        /* Constructed Binary tree is: 
            1 
            / \ 
        2 3 
        / \ \ 
        4 5 8 
                / \ 
            6 7 */
        Console.Write("Maximum level product is " +
                            maxLevelProduct(root));
    }
}
  
// This code is contributed by Rajput-Ji


输出 :

Maximum level product is 160

时间复杂度: O(n)
辅助空间: O(n)