Construct a Binary Tree in Level Order using Recursion
Given an array of integers, the task is to construct a binary tree in level order fashion using Recursion.
Examples
Given an array arr[] = {15, 10, 20, 8, 12, 16, 25}
Approach:
Idea is to keep track of the number of child nodes in the left sub-tree and right sub-tree and then take the decision on the basis of these counts.
- When the count of children nodes in left and right sub-tree are equal, then the node has to be inserted in left sub-tree by creating a new level in the binary tree.
- When the count of children nodes in the left sub-tree is greater than the count of the children nodes in the right sub-tree then there are two cases.
- When the left sub-tree is perfect binary tree, then node is to be inserted in right sub-tree.
- When left sub-tree is not perfect binary tree, then node is to be inserted in left sub-tree.
A perfect binary tree with n levels have 2(n-1) nodes with all the leaf nodes at same level.
Below is the implementation of the above approach
C++
#include <iostream>
using namespace std;
struct Node {
int data;
int rcount;
int lcount;
struct Node* left;
struct Node* right;
};
bool isPBT( int count)
{
count = count + 1;
while (count % 2 == 0)
count = count / 2;
if (count == 1)
return true ;
else
return false ;
}
struct Node* newNode( int data)
{
struct Node* temp =
( struct Node*) malloc (
sizeof ( struct Node)
);
temp->data = data;
temp->right = NULL;
temp->left = NULL;
temp->rcount = 0;
temp->lcount = 0;
}
struct Node* insert( struct Node* root,
int data)
{
if (root == NULL) {
struct Node* n = newNode(data);
return n;
}
if (root->rcount == root->lcount) {
root->left = insert(root->left, data);
root->lcount += 1;
}
else if (root->rcount < root->lcount) {
if (isPBT(root->lcount)) {
root->right = insert(root->right, data);
root->rcount += 1;
}
else {
root->left = insert(root->left, data);
root->lcount += 1;
}
}
return root;
}
void inorder( struct Node* root)
{
if (root != NULL) {
inorder(root->left);
cout << root->data << " " ;
inorder(root->right);
}
}
int main()
{
int arr[] = { 8, 6, 7, 12, 5, 1, 9 };
int size = sizeof (arr) / sizeof ( int );
struct Node* root = NULL;
for ( int i = 0; i < size; i++)
root = insert(root, arr[i]);
inorder(root);
return 0;
}
|
Java
class Node {
int data;
int rcount;
int lcount;
Node left;
Node right;
Node( int data)
{
this .data = data;
this .rcount = this .lcount = 0 ;
this .left = this .right = null ;
}
static void inorder(Node root)
{
if (root != null ) {
inorder(root.left);
System.out.print(root.data + " " );
inorder(root.right);
}
}
static boolean isPBT( int count)
{
count = count + 1 ;
while (count % 2 == 0 )
count = count / 2 ;
if (count == 1 )
return true ;
else
return false ;
}
static Node insert(Node root, int data)
{
if (root == null ) {
Node n = new Node(data);
return n;
}
if (root.rcount == root.lcount) {
root.left = insert(root.left, data);
root.lcount += 1 ;
}
else if (root.rcount < root.lcount) {
if (isPBT(root.lcount)) {
root.right = insert(root.right, data);
root.rcount += 1 ;
}
else {
root.left = insert(root.left, data);
root.lcount += 1 ;
}
}
return root;
}
public static void main(String args[])
{
int arr[] = { 8 , 6 , 7 , 12 , 5 , 1 , 9 };
int size = 7 ;
Node root = null ;
for ( int i = 0 ; i < size; i++)
root = insert(root, arr[i]);
inorder(root);
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self .rcount = 0
self .lcount = 0
self .left = None
self .right = None
def isPBT(count: int ) - > bool :
count = count + 1
while (count % 2 = = 0 ):
count = count / 2
if (count = = 1 ):
return True
else :
return False
def insert(root: Node, data: int ) - > Node:
if (root is None ):
n = Node(data)
return n
if (root.rcount = = root.lcount):
root.left = insert(root.left, data)
root.lcount + = 1
elif (root.rcount < root.lcount):
if (isPBT(root.lcount)):
root.right = insert(root.right, data)
root.rcount + = 1
else :
root.left = insert(root.left, data)
root.lcount + = 1
return root
def inorder(root: Node) - > None :
if root ! = None :
inorder(root.left)
print (root.data, end = " " )
inorder(root.right)
if __name__ = = "__main__" :
arr = [ 8 , 6 , 7 , 12 , 5 , 1 , 9 ]
size = len (arr)
root = None
for i in range (size):
root = insert(root, arr[i])
inorder(root)
|
C#
using System;
class Node {
public int data;
public int rcount;
public int lcount;
public Node left;
public Node right;
public Node( int data)
{
this .data = data;
this .rcount = this .lcount = 0;
this .left = this .right = null ;
}
static void inorder(Node root)
{
if (root != null ) {
inorder(root.left);
Console.Write(root.data + " " );
inorder(root.right);
}
}
static bool isPBT( int count)
{
count = count + 1;
while (count % 2 == 0)
count = count / 2;
if (count == 1)
return true ;
else
return false ;
}
static Node insert(Node root, int data)
{
if (root == null ) {
Node n = new Node(data);
return n;
}
if (root.rcount == root.lcount) {
root.left = insert(root.left, data);
root.lcount += 1;
}
else if (root.rcount < root.lcount) {
if (isPBT(root.lcount)) {
root.right = insert(root.right, data);
root.rcount += 1;
}
else {
root.left = insert(root.left, data);
root.lcount += 1;
}
}
return root;
}
public static void Main(String []args)
{
int []arr = { 8, 6, 7, 12, 5, 1, 9 };
int size = 7;
Node root = null ;
for ( int i = 0; i < size; i++)
root = insert(root, arr[i]);
inorder(root);
}
}
|
Javascript
<script>
class Node{
constructor(data){
this .data = data
this .rcount = 0
this .lcount = 0
this .left = null
this .right = null
}
}
function isPBT(count){
count = count + 1
while (count % 2 == 0)
count = count / 2
if (count == 1)
return true
else
return false
}
function insert(root, data){
if (!root){
let n = new Node(data)
return n
}
if (root.rcount == root.lcount){
root.left = insert(root.left, data)
root.lcount += 1
}
else if (root.rcount < root.lcount){
if (isPBT(root.lcount)){
root.right = insert(root.right, data)
root.rcount += 1
}
else {
root.left = insert(root.left, data)
root.lcount += 1
}
}
return root
}
function inorder(root){
if (root){
inorder(root.left)
document.write(root.data, " " )
inorder(root.right)
}
}
let arr = [ 8, 6, 7, 12, 5, 1, 9 ]
let size = arr.length
let root = null
for (let i=0;i<size;i++)
root = insert(root, arr[i])
inorder(root)
</script>
|
Time Complexity: O(N*logN), where N is the size of the given array.
Auxiliary Space: O(N), for creating N nodes.
Last Updated :
25 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...