# Density of Binary Tree in One Traversal

Given a Binary Tree, find density of it by doing one traversal of it.

`Density of Binary Tree = Size / Height `

Examples:

```Input: Root of following tree
10
/   \
20   30

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

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

Density of a Binary Tree indicates, how balanced Binary Tree is. For example density of a skewed tree is minimum and that of a perfect tree is maximum.

We strongly recommend you to minimize your browser and try this yourself first.

Two traversal based approach is very simple. First find the height using one traversal, then find the size using another traversal. Finally return the ratio of two values.
To do it in one traversal, we compute size of Binary Tree while finding its height. Below is C++ implementation.

## C++

 `//C++ program to find density of a binary tree ` `#include ` `#include ` ` `  `// 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 compute height and ` `// size of a binary tree ` `int` `heighAndSize(Node* node, ``int` `&size) ` `{ ` `    ``if` `(node==NULL) ` `        ``return` `0; ` ` `  `    ``// compute height of each subtree ` `    ``int` `l = heighAndSize(node->left, size); ` `    ``int` `r = heighAndSize(node->right, size); ` ` `  `    ``//increase size by 1 ` `    ``size++; ` ` `  `    ``//return larger of the two ` `    ``return` `(l > r) ? l + 1 : r + 1; ` `} ` ` `  `//function to calculate density of a binary tree ` `float` `density(Node* root) ` `{ ` `    ``if` `(root == NULL) ` `        ``return` `0; ` ` `  `    ``int` `size = 0; ``// To store size ` ` `  `    ``// Finds height and size ` `    ``int` `_height = heighAndSize(root, size); ` ` `  `    ``return` `(``float``)size/_height; ` `} ` ` `  `// Driver code to test above methods ` `int` `main() ` `{ ` `    ``Node* root = newNode(1); ` `    ``root->left = newNode(2); ` `    ``root->right = newNode(3); ` ` `  `    ``printf``(``"Density of given binary tree is %f"``, ` `           ``density(root)); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program to find density of Binary Tree ` ` `  `// A binary tree node ` `class` `Node  ` `{ ` `    ``int` `data; ` `    ``Node left, right; ` ` `  `    ``public` `Node(``int` `data)  ` `    ``{ ` `        ``this``.data = data; ` `        ``left = right = ``null``; ` `    ``} ` `} ` ` `  `// Class to implement pass by reference of size ` `class` `Size  ` `{ ` `    ``// variable to calculate size of tree ` `    ``int` `size = ``0``; ` `} ` ` `  `class` `BinaryTree  ` `{ ` `    ``Node root; ` ` `  `    ``// Function to compute height and ` `    ``// size of a binary tree ` `    ``int` `heighAndSize(Node node, Size size)  ` `    ``{ ` `        ``if` `(node == ``null``) ` `            ``return` `0``; ` ` `  `        ``// compute height of each subtree ` `        ``int` `l = heighAndSize(node.left, size); ` `        ``int` `r = heighAndSize(node.right, size); ` ` `  `        ``//increase size by 1 ` `        ``size.size++; ` ` `  `        ``//return larger of the two ` `        ``return` `(l > r) ? l + ``1` `: r + ``1``; ` `    ``} ` ` `  `    ``//function to calculate density of a binary tree ` `    ``float` `density(Node root)  ` `    ``{ ` `        ``Size size = ``new` `Size(); ` `        ``if` `(root == ``null``) ` `            ``return` `0``; ` `                `  `        ``// Finds height and size ` `        ``int` `_height = heighAndSize(root, size); ` ` `  `        ``return` `(``float``) size.size / _height; ` `    ``} ` ` `  `    ``// Driver code to test above methods ` `    ``public` `static` `void` `main(String[] args)  ` `    ``{ ` `        ``BinaryTree tree = ``new` `BinaryTree(); ` `        ``tree.root = ``new` `Node(``1``); ` `        ``tree.root.left = ``new` `Node(``2``); ` `        ``tree.root.right = ``new` `Node(``3``); ` ` `  `        ``System.out.println(``"Density of given Binary Tree is : "` `                ``+ tree.density(tree.root)); ` `    ``} ` ` `  `} ` ` `  `// This code has been contributed by Mayank Jaiswal(mayank_24) `

## Python3

 `# Python3 program to find density ` `# of a binary tree  ` ` `  `# A binary tree node  ` `# Helper function to allocates a new node ` `class` `newNode:  ` `    ``def` `__init__(``self``, data):  ` `        ``self``.data ``=` `data  ` `        ``self``.left ``=` `self``.right ``=` `None` `         `  `# Function to compute height and  ` `# size of a binary tree  ` `def` `heighAndSize(node, size):  ` ` `  `    ``if` `(node ``=``=` `None``) : ` `        ``return` `0` ` `  `    ``# compute height of each subtree  ` `    ``l ``=` `heighAndSize(node.left, size)  ` `    ``r ``=` `heighAndSize(node.right, size)  ` ` `  `    ``#increase size by 1  ` `    ``size[``0``] ``+``=` `1` ` `  `    ``# return larger of the two  ` `    ``return` `l ``+` `1` `if``(l > r) ``else` `r ``+` `1` ` `  `# function to calculate density  ` `# of a binary tree  ` `def` `density(root): ` ` `  `    ``if` `(root ``=``=` `None``) : ` `        ``return` `0` ` `  `    ``size ``=` `[``0``] ``# To store size  ` ` `  `    ``# Finds height and size  ` `    ``_height ``=` `heighAndSize(root, size)  ` ` `  `    ``return` `size[``0``] ``/` `_height  ` ` `  `# Driver Code  ` `if` `__name__ ``=``=` `'__main__'``: ` `    ``root ``=` `newNode(``1``)  ` `    ``root.left ``=` `newNode(``2``)  ` `    ``root.right ``=` `newNode(``3``)  ` ` `  `    ``print``(``"Density of given binary tree is "``, ` `                               ``density(root)) ` ` `  `# This code is contributed  ` `# by SHUBHAMSINGH10 `

## C#

 `// C# program to find density  ` `// of Binary Tree  ` `using` `System; ` ` `  `// A binary tree node  ` `class` `Node  ` `{  ` `    ``public` `int` `data;  ` `    ``public` `Node left, right;  ` ` `  `    ``public` `Node(``int` `data)  ` `    ``{  ` `        ``this``.data = data;  ` `        ``left = right = ``null``;  ` `    ``}  ` `}  ` ` `  `// Class to implement pass ` `// by reference of size  ` `class` `Size  ` `{  ` `    ``// variable to calculate ` `    ``// size of tree  ` `    ``public` `int` `size = 0;  ` `}  ` ` `  `class` `BinaryTree  ` `{  ` `Node root;  ` ` `  `// Function to compute height  ` `// and size of a binary tree  ` `int` `heighAndSize(Node node, ` `                 ``Size size)  ` `{  ` `    ``if` `(node == ``null``)  ` `        ``return` `0;  ` ` `  `    ``// compute height of each subtree  ` `    ``int` `l = heighAndSize(node.left, size);  ` `    ``int` `r = heighAndSize(node.right, size);  ` ` `  `    ``//increase size by 1  ` `    ``size.size++;  ` ` `  `    ``//return larger of the two  ` `    ``return` `(l > r) ? l + 1 : r + 1;  ` `}  ` ` `  `// function to calculate density ` `// of a binary tree  ` `float` `density(Node root)  ` `{  ` `    ``Size size = ``new` `Size();  ` `    ``if` `(root == ``null``)  ` `        ``return` `0;  ` `             `  `    ``// Finds height and size  ` `    ``int` `_height = heighAndSize(root, size);  ` ` `  `    ``return` `(``float``) size.size / _height;  ` `}  ` ` `  `// Driver code  ` `static` `public` `void` `Main(String []args)  ` `{  ` `    ``BinaryTree tree = ``new` `BinaryTree();  ` `    ``tree.root = ``new` `Node(1);  ` `    ``tree.root.left = ``new` `Node(2);  ` `    ``tree.root.right = ``new` `Node(3);  ` ` `  `    ``Console.WriteLine(``"Density of given "` `+  ` `                      ``"Binary Tree is : "` `+  ` `                  ``tree.density(tree.root));  ` `}  ` `}  ` ` `  `// This code is contributed  ` `// by Arnab Kundu `

Output:

`Density of given binary tree is 1.5`

My Personal Notes arrow_drop_up

Improved By : andrew1234, SHUBHAMSINGH10

Article Tags :
Practice Tags :

4

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.