class
Node
{
int
data;
Node left, right;
public
Node(
int
item)
{
data = item;
left = right =
null
;
}
}
class
BinaryTree
{
Node root;
int
getMin(
int
x,
int
y)
{
return
(x < y) ? x : y;
}
int
closestDown(Node node)
{
if
(node ==
null
)
return
Integer.MAX_VALUE;
if
(node.left ==
null
&& node.right ==
null
)
return
0
;
return
1
+ getMin(closestDown(node.left), closestDown(node.right));
}
int
findClosestUtil(Node node,
char
k, Node ancestors[],
int
index)
{
if
(node ==
null
)
return
Integer.MAX_VALUE;
if
(node.data == k)
{
int
res = closestDown(node);
for
(
int
i = index -
1
; i >=
0
; i--)
res = getMin(res, index - i + closestDown(ancestors[i]));
return
res;
}
ancestors[index] = node;
return
getMin(findClosestUtil(node.left, k, ancestors, index +
1
),
findClosestUtil(node.right, k, ancestors, index +
1
));
}
int
findClosest(Node node,
char
k)
{
Node ancestors[] =
new
Node[
100
];
return
findClosestUtil(node, k, ancestors,
0
);
}
public
static
void
main(String args[])
{
BinaryTree tree =
new
BinaryTree();
tree.root =
new
Node(
'A'
);
tree.root.left =
new
Node(
'B'
);
tree.root.right =
new
Node(
'C'
);
tree.root.right.left =
new
Node(
'E'
);
tree.root.right.right =
new
Node(
'F'
);
tree.root.right.left.left =
new
Node(
'G'
);
tree.root.right.left.left.left =
new
Node(
'I'
);
tree.root.right.left.left.right =
new
Node(
'J'
);
tree.root.right.right.right =
new
Node(
'H'
);
tree.root.right.right.right.left =
new
Node(
'H'
);
char
k =
'H'
;
System.out.println(
"Distance of the closest key from "
+ k +
" is "
+ tree.findClosest(tree.root, k));
k =
'C'
;
System.out.println(
"Distance of the closest key from "
+ k +
" is "
+ tree.findClosest(tree.root, k));
k =
'E'
;
System.out.println(
"Distance of the closest key from "
+ k +
" is "
+ tree.findClosest(tree.root, k));
k =
'B'
;
System.out.println(
"Distance of the closest key from "
+ k +
" is "
+ tree.findClosest(tree.root, k));
}
}