二叉树的平均水平
给定一个非空二叉树,打印每一层节点的平均值。
例子:
如果您希望与专家一起参加现场课程,请参阅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(使用两个队列)
- 首先将根节点推入队列。然后,从队列的前面删除一个节点。
- 对于从队列中移除的每个节点,将其所有子节点推送到一个新的临时队列中。
- 继续从队列中弹出节点并将这些节点的子节点添加到临时队列,直到队列变空。
- 每次队列变空时,表示已经考虑了树的一层。
- 在将节点推入临时队列时,跟踪节点的总和以及推入的节点数,并利用这些总和和计数值找出每一层节点的平均值。
- 在考虑了每个级别后,再次使用临时队列初始化队列并继续该过程,直到两个队列都为空。
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 是指输入树中任何级别的最大节点数。