📌  相关文章
📜  求同级叶子数据总和的乘积

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

求同级叶子数据总和的乘积

给定一棵二叉树,为其返回以下值。
1)对于每个级别,如果该级别有叶子,则计算所有叶子的总和。否则,忽略它。
2) 返回所有和的乘法。
例子:

Input: Root of below tree
         2
       /   \
      7     5
             \
              9
Output: 63
First levels doesn't have leaves. Second level
has one leaf 7 and third level also has one 
leaf 9.  Therefore result is 7*9 = 63


Input: Root of below tree
         2
       /   \
     7      5
    / \      \
   8   6      9
      / \    /  \
     1  11  4    10 

Output: 208
First two levels don't have leaves. Third
level has single leaf 8. Last level has four
leaves 1, 11, 4 and 10. Therefore result is 
8 * (1 + 11 + 4 + 10)  

我们强烈建议您最小化您的浏览器并首先自己尝试。
一种简单的解决方案是从上到下递归地计算所有级别的叶子和。然后将有叶子的级别的总和相乘。该解决方案的时间复杂度为 O(n 2 )。
一个有效的解决方案是使用基于队列的级别顺序遍历。在进行遍历时,分别处理所有不同的级别。对于每个已处理的级别,检查它是否有叶子。如果它有然后计算叶节点的总和。最后返回所有总和的乘积。

C++
/* Iterative C++ program to find sum of data of all leaves
   of a binary tree on same level and then multiply sums
   obtained of all levels. */
#include 
using namespace std;
 
// A Binary Tree Node
struct Node {
    int data;
    struct Node *left, *right;
};
 
// helper function to check if a Node is leaf of tree
bool isLeaf(Node* root)
{
    return (!root->left && !root->right);
}
 
/* Calculate sum of all leaf Nodes at each level and returns
   multiplication of sums */
int sumAndMultiplyLevelData(Node* root)
{
    // Tree is empty
    if (!root)
        return 0;
 
    int mul = 1; /* To store result */
 
    // Create an empty queue for level order traversal
    queue q;
 
    // Enqueue Root and initialize height
    q.push(root);
 
    // Do level order traversal of tree
    while (1) {
        // NodeCount (queue size) indicates number of Nodes
        // at current level.
        int NodeCount = q.size();
 
        // If there are no Nodes at current level, we are done
        if (NodeCount == 0)
            break;
 
        // Initialize leaf sum for current level
        int levelSum = 0;
 
        // A boolean variable to indicate if found a leaf
        // Node at current level or not
        bool leafFound = false;
 
        // Dequeue all Nodes of current level and Enqueue all
        // Nodes of next level
        while (NodeCount > 0) {
            // Process next Node  of current level
            Node* Node = q.front();
 
            /* if Node is a leaf, update sum at the level */
            if (isLeaf(Node)) {
                leafFound = true;
                levelSum += Node->data;
            }
            q.pop();
 
            // Add children of Node
            if (Node->left != NULL)
                q.push(Node->left);
            if (Node->right != NULL)
                q.push(Node->right);
            NodeCount--;
        }
 
        // If we found at least one leaf, we multiply
        // result with level sum.
        if (leafFound)
            mul *= levelSum;
    }
 
    return mul; // Return result
}
 
// Utility function to create a new tree Node
Node* newNode(int data)
{
    Node* temp = new Node;
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}
 
// Driver program to test above functions
int main()
{
    Node* root = newNode(2);
    root->left = newNode(7);
    root->right = newNode(5);
    root->left->right = newNode(6);
    root->left->left = newNode(8);
    root->left->right->left = newNode(1);
    root->left->right->right = newNode(11);
    root->right->right = newNode(9);
    root->right->right->left = newNode(4);
    root->right->right->right = newNode(10);
 
    cout << "Final product value = "
         << sumAndMultiplyLevelData(root) << endl;
 
    return 0;
}


Java
/* Iterative Java program to find sum of data of all leaves
   of a binary tree on same level and then multiply sums
   obtained of all levels. */
 
/* importing the necessary class */
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
 
/* Class containing left and right child of current
 node and key value*/
class Node {
 
    int data;
    Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
class BinaryTree {
 
    Node root;
 
    // helper function to check if a Node is leaf of tree
    boolean isLeaf(Node node)
    {
        return ((node.left == null) && (node.right == null));
    }
 
    /* Calculate sum of all leaf Nodes at each level and returns
     multiplication of sums */
    int sumAndMultiplyLevelData()
    {
        return sumAndMultiplyLevelData(root);
    }
    int sumAndMultiplyLevelData(Node node)
    {
        // Tree is empty
        if (node == null) {
            return 0;
        }
 
        int mul = 1; /* To store result */
 
        // Create an empty queue for level order traversal
        LinkedList q = new LinkedList();
 
        // Enqueue Root and initialize height
        q.add(node);
 
        // Do level order traversal of tree
        while (true) {
 
            // NodeCount (queue size) indicates number of Nodes
            // at current level.
            int NodeCount = q.size();
 
            // If there are no Nodes at current level, we are done
            if (NodeCount == 0) {
                break;
            }
 
            // Initialize leaf sum for current level
            int levelSum = 0;
 
            // A boolean variable to indicate if found a leaf
            // Node at current level or not
            boolean leafFound = false;
 
            // Dequeue all Nodes of current level and Enqueue all
            // Nodes of next level
            while (NodeCount > 0) {
                Node node1;
                node1 = q.poll();
 
                /* if Node is a leaf, update sum at the level */
                if (isLeaf(node1)) {
                    leafFound = true;
                    levelSum += node1.data;
                }
 
                // Add children of Node
                if (node1.left != null) {
                    q.add(node1.left);
                }
                if (node1.right != null) {
                    q.add(node1.right);
                }
                NodeCount--;
            }
 
            // If we found at least one leaf, we multiply
            // result with level sum.
            if (leafFound) {
                mul *= levelSum;
            }
        }
 
        return mul; // Return result
    }
 
    public static void main(String args[])
    {
 
        /* creating a binary tree and entering
         the nodes */
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(2);
        tree.root.left = new Node(7);
        tree.root.right = new Node(5);
        tree.root.left.left = new Node(8);
        tree.root.left.right = new Node(6);
        tree.root.left.right.left = new Node(1);
        tree.root.left.right.right = new Node(11);
        tree.root.right.right = new Node(9);
        tree.root.right.right.left = new Node(4);
        tree.root.right.right.right = new Node(10);
        System.out.println("The final product value : "
                           + tree.sumAndMultiplyLevelData());
    }
}
 
// This code is contributed by Mayank Jaiswal


Python3
"""Iterative Python3 program to find
sum of data of all leaves of a binary
tree on same level and then multiply
sums obtained of all levels."""
 
# A Binary Tree Node
# Utility function to create a
# new tree Node
class newNode:
    def __init__(self, data):
        self.data = data
        self.left = self.right = None
         
# helper function to check if a
# Node is leaf of tree
def isLeaf(root) :
 
    return (not root.left and
            not root.right)
 
""" Calculate sum of all leaf Nodes at each
level and returns multiplication of sums """
def sumAndMultiplyLevelData( root) :
 
    # Tree is empty
    if (not root) :
        return 0
 
    mul = 1
     
    """ To store result """
    # Create an empty queue for level
    # order traversal
    q = []
 
    # Enqueue Root and initialize height
    q.append(root)
 
    # Do level order traversal of tree
    while (1):
         
        # NodeCount (queue size) indicates
        # number of Nodes at current level.
        NodeCount = len(q)
 
        # If there are no Nodes at current
        # level, we are done
        if (NodeCount == 0) :
            break
 
        # Initialize leaf sum for
        # current level
        levelSum = 0
 
        # A boolean variable to indicate
        # if found a leaf Node at current
        # level or not
        leafFound = False
 
        # Dequeue all Nodes of current level
        # and Enqueue all Nodes of next level
        while (NodeCount > 0) :
             
            # Process next Node of current level
            Node = q[0]
 
            """ if Node is a leaf, update
                sum at the level """
            if (isLeaf(Node)) :
                leafFound = True
                levelSum += Node.data
 
            q.pop(0)
 
            # Add children of Node
            if (Node.left != None) :
                q.append(Node.left)
            if (Node.right != None) :
                q.append(Node.right)
            NodeCount-=1
                 
        # If we found at least one leaf,
        # we multiply result with level sum.
        if (leafFound) :
            mul *= levelSum
     
    return mul # Return result
 
# Driver Code
if __name__ == '__main__':
    root = newNode(2)
    root.left = newNode(7)
    root.right = newNode(5)
    root.left.right = newNode(6)
    root.left.left = newNode(8)
    root.left.right.left = newNode(1)
    root.left.right.right = newNode(11)
    root.right.right = newNode(9)
    root.right.right.left = newNode(4)
    root.right.right.right = newNode(10)
 
    print("Final product value = ",
           sumAndMultiplyLevelData(root))
 
# This code is contributed
# by SHUBHAMSINGH10


C#
/* Iterative C# program to find sum
of data of all leaves of a binary tree
on same level and then multiply sums
obtained of all levels. */
 
/* importing the necessary class */
using System;
using System.Collections.Generic;
 
/* Class containing left and right child
 of current node and key value*/
public class Node
{
 
    public int data;
    public Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
public class BinaryTree
{
 
    Node root;
 
    // helper function to check if
    // a Node is leaf of tree
    bool isLeaf(Node node)
    {
        return ((node.left == null) &&
                (node.right == null));
    }
 
    /* Calculate sum of all leaf
    Nodes at each level and returns
    multiplication of sums */
    int sumAndMultiplyLevelData()
    {
        return sumAndMultiplyLevelData(root);
    }
    int sumAndMultiplyLevelData(Node node)
    {
        // Tree is empty
        if (node == null) {
            return 0;
        }
 
        int mul = 1; /* To store result */
 
        // Create an empty queue for level order traversal
        Queue q = new Queue();
 
        // Enqueue Root and initialize height
        q.Enqueue(node);
 
        // Do level order traversal of tree
        while (true) {
 
            // NodeCount (queue size) indicates
            // number of Nodes at current level.
            int NodeCount = q.Count;
 
            // If there are no Nodes at current
            // level, we are done
            if (NodeCount == 0)
            {
                break;
            }
 
            // Initialize leaf sum for current level
            int levelSum = 0;
 
            // A boolean variable to indicate if found a leaf
            // Node at current level or not
            bool leafFound = false;
 
            // Dequeue all Nodes of current level and
            // Enqueue all Nodes of next level
            while (NodeCount > 0)
            {
                Node node1;
                node1 = q.Dequeue();
 
                /* if Node is a leaf, update sum at the level */
                if (isLeaf(node1))
                {
                    leafFound = true;
                    levelSum += node1.data;
                }
 
                // Add children of Node
                if (node1.left != null)
                {
                    q.Enqueue(node1.left);
                }
                if (node1.right != null)
                {
                    q.Enqueue(node1.right);
                }
                NodeCount--;
            }
 
            // If we found at least one leaf, we multiply
            // result with level sum.
            if (leafFound)
            {
                mul *= levelSum;
            }
        }
 
        return mul; // Return result
    }
 
    // Driver code
    public static void Main(String []args)
    {
 
        /* creating a binary tree and entering
        the nodes */
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(2);
        tree.root.left = new Node(7);
        tree.root.right = new Node(5);
        tree.root.left.left = new Node(8);
        tree.root.left.right = new Node(6);
        tree.root.left.right.left = new Node(1);
        tree.root.left.right.right = new Node(11);
        tree.root.right.right = new Node(9);
        tree.root.right.right.left = new Node(4);
        tree.root.right.right.right = new Node(10);
        Console.WriteLine("The final product value : "
                        + tree.sumAndMultiplyLevelData());
    }
}
 
// This code has been contributed by 29AjayKumar


Javascript


输出:

Final product value = 208