📌  相关文章
📜  二叉树中每个水平级别的叶节点总和

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

二叉树中每个水平级别的叶节点总和

给定一棵二叉树,任务是找到给定树每一层的叶子节点的总和。

例子:

方法:给定的问题可以通过使用水平顺序遍历来解决。请按照以下步骤解决给定的问题:

  • 创建一个队列qu ,将节点存储在其级别旁边。此外,创建一个地图来存储每个级别的总和。
  • 从根节点开始进行级别顺序遍历,将每个节点及其级别存储在队列中,同时检查当前节点是否为叶子节点。如果它是叶节点,则将其值添加到与其级别对应的映射中。
  • 完成上述步骤后,将映射中的值打印为给定树的每个级别的总和。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Tree node structure
class Node {
public:
    int data;
    Node *left, *right;
 
    Node(int data)
    {
        this->data = data;
        left = right = NULL;
    }
};
 
// Function to print the sum of leaf nodes
// at each horizontal level
void printLevelSum(Node* root)
{
    if (root == NULL) {
        cout << "No nodes present\n";
        return;
    }
 
    // Map to hold sum at each level
    map mp;
 
    // Queue to hold tree node with level
    queue > q;
 
    // Root node is at level 1
    q.push({ root, 1 });
 
    pair p;
 
    // Level Order Traversal of tree
    while (!q.empty()) {
        p = q.front();
        q.pop();
 
        // Create a key for each level
        // in the map
        if (mp.find(p.second) == mp.end()) {
            mp[p.second] = 0;
        }
 
        // If current node is a leaf node
        if (p.first->left == NULL
            && p.first->right == NULL) {
 
            // Adding value in the map
            // corresponding to its level
            mp[p.second] += p.first->data;
        }
 
        if (p.first->left)
            q.push({ p.first->left, p.second + 1 });
        if (p.first->right)
            q.push({ p.first->right, p.second + 1 });
    }
 
    // Print the sum at each level
    for (auto i : mp) {
        cout << i.second << endl;
    }
}
 
// Driver Code
int main()
{
    Node* root = new Node(1);
    root->left = new Node(2);
    root->right = new Node(3);
    root->left->left = new Node(4);
    root->left->right = new Node(5);
    root->right->left = new Node(6);
    root->right->right = new Node(7);
    root->left->left->right = new Node(8);
    root->left->right->right = new Node(9);
    root->right->right->left = new Node(10);
    root->right->right->right = new Node(11);
    root->left->left->right->right = new Node(12);
 
    printLevelSum(root);
 
    return 0;
}


Java
// Java program for the above approach
 
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.HashMap;
 
public class Print_Level_Sum_Btree {
     
    /* A tree node structure */
    static class Node {
        int data;
        Node left;
        Node right;
        Node(int data){
            this.data = data;
            left = null;
            right = null;
        }
    }
     
    // User defined class Pair to hold
    // the node and its level
    static class Pair{
        Node n;
        int i;
        Pair(Node n, int i){
            this.n = n;
            this.i = i;
        }
         
    }
     
    // Function to print the sum of leaf nodes
    // at each horizontal level
    static void printLevelSum(Node root)
    {
        if (root == null)
        {
            System.out.println("No nodes present");
            return;
        }
         
        // hashmap to hold sum at each level
        HashMap map = new HashMap<>();
         
         
        // queue to hold tree node with level
        Queue q = new LinkedList();
     
        // Root node is at level 1
        q.add(new Pair(root, 1));
     
        Pair p;
     
        // Level Order Traversal of tree
        while (!q.isEmpty()) {
            p = q.peek();
            q.remove();
             
              // Create a key for each level
            // in the map
            if (!map.containsKey(p.i))
                map.put(p.i, 0);
             
              // If current node is a leaf node
            if (p.n.left == null && p.n.right == null)
            {
                  // Adding value in the map
                // corresponding to its level
                map.put(p.i, map.get(p.i) + p.n.data);
            }
             
            if (p.n.left != null)
                q.add(new Pair(p.n.left, p.i + 1));
            if (p.n.right != null)
                q.add(new Pair(p.n.right, p.i + 1));
        }
         
          // Print the sum at each level
        for (Map.Entry mapElement : map.entrySet()) {
            int value = ((int)mapElement.getValue());
   
            System.out.println(value);
        }
    }
     
    // Driver Code
    public static void main(String args[])
    {
        Node root = null;
        root = new Node(1);
        root.left = new Node(2);
        root.right = new Node(3);
        root.left.left = new Node(4);
        root.left.right = new Node(5);
        root.right.left = new Node(6);
        root.right.right = new Node(7);
        root.left.left.right = new Node(8);
        root.left.right.right = new Node(9);
        root.right.right.left = new Node(10);
        root.right.right.right = new Node(11);
        root.left.left.right.right = new Node(12);
         
        printLevelSum(root);
    }
}
 
// This code is contributed by vineetsharma36.


Python3
# Python3 program for the above approach
class newNode:
   
    # Construct to create a new node
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
 
# Function to print the sum of leaf nodes
# at each horizontal level
def printLevelSum(root):
 
    if (not root):
        print("No nodes present")
        return
 
    # Dictionary to hold sum at each level
    dict = {}
 
    # queue to hold tree node with level
    q = []
 
    # Root node is at level 1
    q.append([root, 1])
 
    p = []
 
    # Level order Traversal of Tree
    while (len(q)):
        p=q[0]
        q.pop(0)
         
        # Create a key for each level
        # in the dictionary
        if (p[1] not in dict.keys()):
            dict[p[1]] = 0
             
        # If current node is a leaf node
        if (not p[0].left and not p[0].right):
            # Adding value in the dictionary
            # corresponding to its level
            dict[p[1]] = p[0].data + dict.get(p[1])
         
        if (p[0].left):
            q.append([p[0].left, p[1] + 1])
        if (p[0].right):
            q.append([p[0].right, p[1] + 1])
     
    # Print the sum at each level
    for sum in dict.values():
        print(sum)
 
# Driver Code
if __name__ == '__main__':
 
    root = newNode(1)
    root.left = newNode(2)
    root.right = newNode(3)
    root.left.left = newNode(4)
    root.left.right = newNode(5)
    root.right.left = newNode(6)
    root.right.right = newNode(7)
    root.left.left.right = newNode(8)
    root.left.right.right = newNode(9)
    root.right.right.left = newNode(10)
    root.right.right.right = newNode(11)
    root.left.left.right.right = newNode(12)
     
    printLevelSum(root)
     
    # This code is contributed by vineetsharma36.


C#
// C# program for the above approach
using System;
using System.Collections.Generic;
 
public class Print_Level_Sum_Btree {
     
    /* A tree node structure */
   public class Node {
      public  int data;
      public  Node left;
      public  Node right;
      public  Node(int data){
            this.data = data;
            left = null;
            right = null;
        }
    }
     
    // User defined class Pair to hold
    // the node and its level
  public  class Pair{
       public Node n;
      public  int i;
      public  Pair(Node n, int i){
            this.n = n;
            this.i = i;
        }
         
    }
     
    // Function to print the sum of leaf nodes
    // at each horizontal level
    static void printLevelSum(Node root)
    {
        if (root == null)
        {
            Console.WriteLine("No nodes present");
            return;
        }
         
        // hashmap to hold sum at each level
        Dictionary map = new Dictionary();
         
         
        // queue to hold tree node with level
        Queue q = new Queue();
     
        // Root node is at level 1
        q.Enqueue(new Pair(root, 1));
     
        Pair p;
     
        // Level Order Traversal of tree
        while (q.Count!=0) {
            p = q.Peek();
            q.Dequeue();
             
              // Create a key for each level
            // in the map
            if (!map.ContainsKey(p.i))
                map.Add(p.i, 0);
             
              // If current node is a leaf node
            if (p.n.left == null && p.n.right == null)
            {
                  // Adding value in the map
                // corresponding to its level
                map[p.i]= map[p.i] + p.n.data;
            }
             
            if (p.n.left != null)
                q.Enqueue(new Pair(p.n.left, p.i + 1));
            if (p.n.right != null)
                q.Enqueue(new Pair(p.n.right, p.i + 1));
        }
         
          // Print the sum at each level
       foreach(KeyValuePair entry in map){
            int value = (entry.Value);
   
            Console.WriteLine(value);
        }
    }
     
    // Driver Code
    public static void Main(String []args)
    {
        Node root = null;
        root = new Node(1);
        root.left = new Node(2);
        root.right = new Node(3);
        root.left.left = new Node(4);
        root.left.right = new Node(5);
        root.right.left = new Node(6);
        root.right.right = new Node(7);
        root.left.left.right = new Node(8);
        root.left.right.right = new Node(9);
        root.right.right.left = new Node(10);
        root.right.right.right = new Node(11);
        root.left.left.right.right = new Node(12);
         
        printLevelSum(root);
    }
}
 
// This code is contributed by umadevi9616


Javascript


输出
0
0
6
30
12

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