📜  二叉树的平均水平

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

二叉树的平均水平

给定一个非空二叉树,打印每一层节点的平均值。

例子:

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。

Input : 
    4
   / \
  2   9
 / \   \
3   5   7

Output : [4 5.5 5]
The average value of nodes on level 0 is 4, 
on level 1 is 5.5, and on level 2 is 5. 
Hence, print [4 5.5 5].

思路是基于Level order 逐行遍历|设置 2(使用两个队列)



  1. 首先将根节点推入队列。然后,从队列的前面删除一个节点。
  2. 对于从队列中移除的每个节点,将其所有子节点推送到一个新的临时队列中。
  3. 继续从队列中弹出节点并将这些节点的子节点添加到临时队列,直到队列变空。
  4. 每次队列变空时,表示已经考虑了树的一层。
  5. 在将节点推入临时队列时,跟踪节点的总和以及推入的节点数,并利用这些总和和计数值找出每一层节点的平均值。
  6. 在考虑了每个级别后,再次使用临时队列初始化队列并继续该过程,直到两个队列都为空。
C++
// C++ program to find averages of all levels
// in a 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 val;
    struct Node* left, *right;
};
 
/* Function to print the average value of the
   nodes on each level */
void averageOfLevels(Node* root)
{
    vector res;
 
    // Traversing level by level
    queue q;
    q.push(root);
 
    while (!q.empty()) {
 
        // Compute sum of nodes and
        // count of nodes in current
        // level.
        int sum = 0, count = 0;
        queue temp;
        while (!q.empty()) {
            Node* n = q.front();
            q.pop();
            sum += n->val;
            count++;
            if (n->left != NULL)
                temp.push(n->left);
            if (n->right != NULL)
                temp.push(n->right);
        }
        q = temp;
        cout << (sum * 1.0 / count) << " ";
    }
}
 
/* Helper function that allocates a
   new node with the given data and
   NULL left and right pointers. */
Node* newNode(int data)
{
    Node* temp = new Node;
    temp->val = data;
    temp->left = temp->right = NULL;
    return temp;
}
 
// Driver code
int main()
{
    /* Let us construct a Binary Tree
        4
       / \
      2   9
     / \   \
    3   5   7 */
 
    Node* root = NULL;
    root = newNode(4);
    root->left = newNode(2);
    root->right = newNode(9);
    root->left->left = newNode(3);
    root->left->right = newNode(8);
    root->right->right = newNode(7);
    averageOfLevels(root);
    return 0;
}


Java
// Java program to find averages of all levels
// in a 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 val;
    Node left, right;
}
 
/* Function to print the average value of the
nodes on each level */
static void averageOfLevels(Node root)
{
    //vector res;
 
    // Traversing level by level
    Queue q = new LinkedList ();
    q.add(root);
    int sum = 0, count  = 0;
 
    while (!q.isEmpty()) {
 
        // Compute sum of nodes and
        // count of nodes in current
        // level.
        sum = 0;
        count = 0;
        Queue temp = new LinkedList ();
        while (!q.isEmpty()) {
            Node n = q.peek();
            q.remove();
            sum += n.val;
            count++;
            if (n.left != null)
                temp.add(n.left);
            if (n.right != null)
                temp.add(n.right);
        }
        q = temp;
        System.out.print((sum * 1.0 / count) + " ");
    }
}
 
/* Helper function that allocates a
new node with the given data and
NULL left and right pointers. */
static Node newNode(int data)
{
    Node temp = new Node();
    temp.val = data;
    temp.left = null;
    temp.right = null;
    return temp;
}
 
// Driver code
public static void main(String[] args)
{
    /* Let us construct a Binary Tree
        4
    / \
    2 9
    / \ \
    3 5 7 */
 
    Node root = null;
    root = newNode(4);
    root.left = newNode(2);
    root.right = newNode(9);
    root.left.left = newNode(3);
    root.left.right = newNode(5);
    root.right.right = newNode(7);
    System.out.println("Averages of levels : ");
    System.out.print("[");
    averageOfLevels(root);
    System.out.println("]");
}
}


Python3
# Python3 program to find averages of
# all levels in a binary tree.
 
# Importing Queue
from queue import Queue
 
# Helper class that allocates a
# new node with the given data and
# None left and right pointers.
class newNode:
    def __init__(self, data):
        self.val = data
        self.left = self.right = None
     
# Function to print the average value
# of the nodes on each level
def averageOfLevels(root):
 
    # Traversing level by level
    q = Queue()
    q.put(root)
    while (not q.empty()):
 
        # Compute Sum of nodes and
        # count of nodes in current
        # level.
        Sum = 0
        count = 0
        temp = Queue()
        while (not q.empty()):
            n = q.queue[0]
            q.get()
            Sum += n.val
            count += 1
            if (n.left != None):
                temp.put(n.left)
            if (n.right != None):
                temp.put(n.right)
        q = temp
        print((Sum * 1.0 / count), end = " ")
 
# Driver code
if __name__ == '__main__':
 
    # Let us construct a Binary Tree
    #     4
    # / \
    # 2 9
    # / \ \
    # 3 5 7
    root = None
    root = newNode(4)
    root.left = newNode(2)
    root.right = newNode(9)
    root.left.left = newNode(3)
    root.left.right = newNode(8)
    root.right.right = newNode(7)
    averageOfLevels(root)
 
# This code is contributed by PranchalK


C#
// C# program to find averages of all levels
// in a 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 val;
        public Node left, right;
    }
 
    /* Function to print the average value of the
    nodes on each level */
    static void averageOfLevels(Node root)
    {
        //vector res;
 
        // Traversing level by level
        Queue q = new Queue ();
        q.Enqueue(root);
        int sum = 0, count = 0;
 
        while ((q.Count!=0))
        {
 
            // Compute sum of nodes and
            // count of nodes in current
            // level.
            sum = 0;
            count = 0;
            Queue temp = new Queue ();
            while (q.Count != 0)
            {
                Node n = q.Peek();
                q.Dequeue();
                sum += n.val;
                count++;
                if (n.left != null)
                    temp.Enqueue(n.left);
                if (n.right != null)
                    temp.Enqueue(n.right);
            }
            q = temp;
            Console.Write((sum * 1.0 / count) + " ");
        }
    }
 
    /* Helper function that allocates a
    new node with the given data and
    NULL left and right pointers. */
    static Node newNode(int data)
    {
        Node temp = new Node();
        temp.val = data;
        temp.left = null;
        temp.right = null;
        return temp;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        /* Let us construct a Binary Tree
            4
        / \
        2 9
        / \ \
        3 5 7 */
 
        Node root = null;
        root = newNode(4);
        root.left = newNode(2);
        root.right = newNode(9);
        root.left.left = newNode(3);
        root.left.right = newNode(5);
        root.right.right = newNode(7);
        Console.WriteLine("Averages of levels : ");
        Console.Write("[");
        averageOfLevels(root);
        Console.WriteLine("]");
    }
}
 
// This code has been contributed by
// 29AjayKumar


Javascript


输出:

Average of levels: 
[4 5.5 5]

复杂度分析:

  • 时间复杂度: O(n)。
    整棵树最多被遍历一次。这里,n 是指给定二叉树中的节点数。
  • 辅助空间:O(n)。
    队列的大小最多可以增长到给定二叉树中任何级别的最大节点数。这里,n 是指输入树中任何级别的最大节点数。