using
System;
using
System.Collections.Generic;
public
class
Node
{
public
int
data;
public
Node left, right;
public
Node(
int
data)
{
this
.data = data;
left = right =
null
;
}
}
public
class
NodeDetails
{
public
Node node;
public
int
min, max;
public
NodeDetails(Node node,
int
min,
int
max)
{
this
.node = node;
this
.min = min;
this
.max = max;
}
}
class
GFG{
public
static
void
preorder(Node root)
{
if
(root ==
null
)
return
;
Console.Write(root.data +
" "
);
preorder(root.left);
preorder(root.right);
}
public
static
Node constructBST(
int
[] arr,
int
n)
{
Node root =
new
Node(arr[0]);
Queue<NodeDetails> q =
new
Queue<NodeDetails>();
q.Enqueue(
new
NodeDetails(root,
int
.MinValue,
int
.MaxValue));
int
i = 1;
while
(q.Count != 0)
{
NodeDetails temp = q.Dequeue();
Node c = temp.node;
int
min = temp.min, max = temp.max;
if
(i < n && min < arr[i] &&
arr[i] < c.data)
{
c.left =
new
Node(arr[i]);
i++;
q.Enqueue(
new
NodeDetails(c.left, min,
c.data));
}
if
(i < n && c.data < arr[i] && arr[i] < max)
{
c.right =
new
Node(arr[i]);
i++;
q.Enqueue(
new
NodeDetails(c.right,
c.data, max));
}
}
return
root;
}
public
static
void
Main(String[] args)
{
int
n = 9;
int
[] arr = { 7, 4, 12, 3, 6, 8, 1, 5, 10 };
Node root = constructBST(arr, n);
preorder(root);
}
}