using
System;
class
GFG
{
public
class
node
{
public
int
data;
public
node left;
public
node right;
};
static
node newNode(
int
data)
{
node node =
new
node();
node.data = data;
node.left =
null
;
node.right =
null
;
return
node;
}
public
class
returnType
{
public
Boolean isPerfect;
public
Boolean isComplete;
public
int
size;
public
node rootTree;
};
static
int
getHeight(
int
size)
{
return
(
int
)Math.Ceiling(Math.Log(size + 1) /
Math.Log(2));
}
static
returnType findCompleteBinaryTree(node root)
{
returnType rt=
new
returnType();
if
(root ==
null
)
{
rt.isPerfect =
true
;
rt.isComplete =
true
;
rt.size = 0;
rt.rootTree =
null
;
return
rt;
}
returnType lv = findCompleteBinaryTree(root.left);
returnType rv = findCompleteBinaryTree(root.right);
if
(lv.isPerfect ==
true
&&
rv.isComplete ==
true
&&
getHeight(lv.size) == getHeight(rv.size))
{
rt.isComplete =
true
;
rt.isPerfect = (rv.isPerfect ?
true
:
false
);
rt.size = lv.size + rv.size + 1;
rt.rootTree = root;
return
rt;
}
if
(lv.isComplete ==
true
&&
rv.isPerfect ==
true
&&
getHeight(lv.size) == getHeight(rv.size) + 1)
{
rt.isComplete =
true
;
rt.isPerfect =
false
;
rt.size = lv.size + rv.size + 1;
rt.rootTree = root;
return
rt;
}
rt.isPerfect =
false
;
rt.isComplete =
false
;
rt.size = Math.Max(lv.size, rv.size);
rt.rootTree = (lv.size > rv.size ?
lv.rootTree : rv.rootTree);
return
rt;
}
static
void
inorderPrint(node root)
{
if
(root !=
null
)
{
inorderPrint(root.left);
Console.Write(root.data +
" "
);
inorderPrint(root.right);
}
}
public
static
void
Main(String []args)
{
node root = newNode(50);
root.left = newNode(30);
root.right = newNode(60);
root.left.left = newNode(5);
root.left.right = newNode(20);
root.right.left = newNode(45);
root.right.right = newNode(70);
root.right.left.left = newNode(10);
returnType ans = findCompleteBinaryTree(root);
Console.WriteLine(
"Size : "
+ ans.size);
Console.Write(
"Inorder Traversal : "
);
inorderPrint(ans.rootTree);
}
}