using
System;
using
System.Collections.Generic;
class
GFG
{
static
int
prev;
class
TreeNode
{
public
int
val;
public
TreeNode left, right;
public
TreeNode(
int
key)
{
val = key;
left =
null
;
right =
null
;
}
};
static
bool
isBST(TreeNode root, TreeNode l,
TreeNode r)
{
if
(root ==
null
)
return
true
;
if
(l !=
null
&& root.val <= l.val)
return
false
;
if
(r !=
null
&& root.val >= r.val)
return
false
;
return
isBST(root.left, l, root) &
isBST(root.right, root, r);
}
static
void
ConvTree(TreeNode root)
{
if
(root ==
null
)
return
;
ConvTree(root.left);
int
optEle = root.val;
String strEle = String.Join(
""
, root.val);
bool
flag =
true
;
for
(
int
idx = 0; idx < strEle.Length; idx++)
{
int
shiftedNum = Int32.Parse(
strEle.Substring(idx) +
strEle.Substring(0, idx));
if
(shiftedNum >= prev && flag)
{
optEle = shiftedNum;
flag =
false
;
}
if
(shiftedNum >= prev)
optEle = Math.Min(optEle, shiftedNum);
}
root.val = optEle;
prev = root.val;
ConvTree(root.right);
}
static
void
levelOrder(TreeNode root)
{
Queue<TreeNode> que =
new
Queue<GFG.TreeNode>();
que.Enqueue(root);
while
(
true
)
{
int
length = que.Count;
if
(length == 0)
break
;
while
(length > 0)
{
TreeNode temp = que.Peek();
que.Dequeue();
Console.Write(temp.val +
" "
);
if
(temp.left !=
null
)
que.Enqueue(temp.left);
if
(temp.right !=
null
)
que.Enqueue(temp.right);
length -= 1;
}
Console.WriteLine();
}
Console.WriteLine();
}
public
static
void
Main(String[] args)
{
TreeNode root =
new
TreeNode(443);
root.left =
new
TreeNode(132);
root.right =
new
TreeNode(543);
root.right.left =
new
TreeNode(343);
root.right.right =
new
TreeNode(237);
prev = -1;
ConvTree(root);
if
(isBST(root,
null
,
null
))
{
levelOrder(root);
}
else
{
Console.Write(-1);
}
}
}