📜  使用层序遍历的二叉树密度

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

使用层序遍历的二叉树密度

给定一棵二叉树,通过遍历它来找到它的密度。
二叉树的密度定义为:

Density of Binary Tree = Size / Height 

例子

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

Input : 
 Root of following tree
   10
  /   \
 20   30

Output :  1.5
Height of given tree = 2
Size of given tree = 3


Input :
Root of the following tree
     10
    /   
   20   
 /
30
Output : 1
Height of given tree = 3
Size of given tree = 3 

树的大小和高度可以使用层序遍历在单次遍历中找到。
为了计算二叉树的高度,想法是使用“NULL”指针作为两个级别之间的分隔符。只要在遍历过程中出现“NULL”,高度就会增加。
要计算二叉树的大小,请为在级别顺序遍历期间遇到的每个新节点增加计数器。
最后用上面的公式计算二叉树的密度。



下面是上述方法的实现:

C++
// C++ implementation of the above approach
#include 
using namespace std;
 
// A binary tree node
struct Node {
    int data;
    Node *left, *right;
};
 
// Helper function to allocates a new node
Node* newNode(int data)
{
    Node* node = new Node;
    node->data = data;
    node->left = node->right = NULL;
    return node;
}
 
// Function to calculate density of Binary Tree
float density(Node* root)
{
    queue q;
 
    // push root to queue first
    q.push(root);
     
    // push NULL as a separator
    q.push(NULL);
    int height = 1, size = 0;
    while (!q.empty()) {
        Node* t = q.front();
        q.pop();
        if (t)
            size++;
        else {
 
            // If after popping NULL queue is
            // empty then get out of loop i.e
            // stop the level order traversal.
            if (q.empty())
                break;
            q.push(NULL);
            height++;
            continue;
        }
 
        // if t has left child
        // then push it to queue
        if (t->left) {
            q.push(t->left);
        }
 
        // if t has right child
        // then push it to queue
        if (t->right) {
            q.push(t->right);
        }
    }
    return (float)size / height;
}
 
// Driver code
int main()
{
    Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
 
    cout << density(root) << endl;
    return 0;
}


Java
// Java implementation of the above approach
import java.util.*;
 
class Solution
{
 
// A binary tree node
static class Node
{
    int data;
    Node left, right;
}
 
// Helper function to allocates a new node
static Node newNode(int data)
{
    Node node = new Node();
    node.data = data;
    node.left = node.right = null;
    return node;
}
 
// Function to calculate density of Binary Tree
static float density(Node root)
{
    Queue q = new LinkedList();
 
    // add root to queue first
    q.add(root);
     
    // add null as a separator
    q.add(null);
    int height = 1, size = 0;
    while (q.size() > 0)
    {
        Node t = q.peek();
        q.remove();
        if (t != null)
            size++;
        else
        {
 
            // If after removeping null queue is
            // empty then get out of loop i.e
            // stop the level order traversal.
            if (q.size() == 0)
                break;
            q.add(null);
            height++;
            continue;
        }
 
        // if t has left child
        // then add it to queue
        if (t.left !=null)
        {
            q.add(t.left);
        }
 
        // if t has right child
        // then add it to queue
        if (t.right != null)
        {
            q.add(t.right);
        }
    }
    return ((float)size )/ height;
}
 
// Driver code
public static void main(String args[])
{
    Node root = newNode(1);
    root.left = newNode(2);
    root.right = newNode(3);
 
    System.out.println(density(root));
}
}
 
// This code is contributed by Arnab Kundu


Python3
# Python implementation of the above approach
 
# Linked List node
class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
# Helper function to allocates a new node
def newNode( data) :
 
    node = Node(0)
    node.data = data
    node.left = node.right = None
    return node
 
# Function to calculate density of Binary Tree
def density(root) :
 
    q = []
 
    # append root to queue first
    q.append(root)
     
    # append None as a separator
    q.append(None)
    height = 1
    size = 0
    while (len(q) > 0):
        t = q[0]
        q.pop(0)
        if (t != None):
            size = size + 1
        else:
 
            # If after removeping None queue is
            # empty then get out of loop i.e
            # stop the level order traversal.
            if (len(q) == 0):
                break
            q.append(None)
            height = height + 1
            continue
 
        # if t has left child
        # then append it to queue
        if (t.left != None) :
            q.append(t.left)
 
        # if t has right child
        # then append it to queue
        if (t.right != None):
         
            q.append(t.right)
 
    return (size ) / height
 
# Driver code
 
root = newNode(1)
root.left = newNode(2)
root.right = newNode(3)
 
print(density(root))
 
# This code is contributed by Arnab Kundu


C#
// C# implementation of the above approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
// A binary tree node
public class Node
{
    public int data;
    public Node left, right;
}
 
// Helper function to allocates a new node
static Node newNode(int data)
{
    Node node = new Node();
    node.data = data;
    node.left = node.right = null;
    return node;
}
 
// Function to calculate density of Binary Tree
static float density(Node root)
{
    Queue q = new Queue();
 
    // add root to queue first
    q.Enqueue(root);
     
    // add null as a separator
    q.Enqueue(null);
    int height = 1, size = 0;
    while (q.Count > 0)
    {
        Node t = q.Peek();
        q.Dequeue();
        if (t != null)
            size++;
        else
        {
 
            // If after removeping null queue is
            // empty then get out of loop i.e
            // stop the level order traversal.
            if (q.Count == 0)
                break;
            q.Enqueue(null);
            height++;
            continue;
        }
 
        // if t has left child
        // then add it to queue
        if (t.left !=null)
        {
            q.Enqueue(t.left);
        }
 
        // if t has right child
        // then add it to queue
        if (t.right != null)
        {
            q.Enqueue(t.right);
        }
    }
    return ((float)size ) / height;
}
 
// Driver code
public static void Main(String []args)
{
    Node root = newNode(1);
    root.left = newNode(2);
    root.right = newNode(3);
 
    Console.WriteLine(density(root));
}
}
 
// This code is contributed by PrinciRaj1992


Javascript


输出:
1.5

时间复杂度: O(N)