import
java.util.ArrayList;
class
GFG
{
static
class
node
{
int
data;
node left, right;
public
node(
int
x)
{
data = x;
left = right =
null
;
}
};
static
void
insertionSort(ArrayList<Integer> v,
int
n) {
int
i, key, j;
for
(i =
1
; i < n; i++) {
key = v.get(i);
j = i -
1
;
while
(j >=
0
&& v.get(j) > key) {
v.set(j +
1
, v.get(i));
j = j -
1
;
}
v.set(j +
1
, key);
}
}
static
void
inorder(node root, ArrayList<Integer> v) {
if
(root ==
null
)
return
;
inorder(root.left, v);
v.add(root.data);
inorder(root.right, v);
}
static
void
find(node root,
int
res,
int
res2)
{
if
(root ==
null
) {
return
;
}
find(root.left, res, res2);
if
(root.data == res) {
root.data = res2;
}
else
if
(root.data == res2) {
root.data = res;
}
find(root.right, res, res2);
}
static
node correctBST(node root)
{
ArrayList<Integer> v =
new
ArrayList<>();
inorder(root, v);
ArrayList<Integer> v1 =
new
ArrayList<>(v);
insertionSort(v, v.size());
for
(
int
i =
0
; i < v.size(); i++) {
if
(v.get(i) != v1.get(i)) {
find(root, v1.get(i), v.get(i));
break
;
}
}
return
root;
}
static
void
printInorder(node node) {
if
(node ==
null
)
return
;
printInorder(node.left);
System.out.printf(
"%d "
, node.data);
printInorder(node.right);
}
public
static
void
main(String[] args) {
node root =
new
node(
6
);
root.left =
new
node(
10
);
root.right =
new
node(
2
);
root.left.left =
new
node(
1
);
root.left.right =
new
node(
3
);
root.right.right =
new
node(
12
);
root.right.left =
new
node(
7
);
System.out.printf(
"Inorder Traversal of the"
);
System.out.printf(
"original tree \n"
);
printInorder(root);
correctBST(root);
System.out.printf(
"\nInorder Traversal of the"
);
System.out.printf(
"fixed tree \n"
);
printInorder(root);
}
}