using
System;
using
System.Collections.Generic;
class
GFG {
public
class
Node {
public
int
data;
public
Node left;
public
Node right;
public
Node()
{
left =
null
;
right =
null
;
}
}
public
static
Node newNode(
int
val)
{
Node temp =
new
Node();
temp.data = val;
return
temp;
}
public
static
Node n1 =
null
;
public
static
void
getparent(Node root, Node parent,
Dictionary<Node, Node> map)
{
if
(root ==
null
)
return
;
map[root] = parent;
getparent(root.left, root, map);
getparent(root.right, root, map);
return
;
}
public
static
void
getnode(Node root,
int
a)
{
if
(root ==
null
)
return
;
if
(root.data == a)
n1 = root;
getnode(root.left, a);
getnode(root.right, a);
return
;
}
public
static
int
getmaxdis(Node target,
int
dis,
Dictionary<Node,
int
> vis,
Dictionary<Node, Node> map)
{
if
(target ==
null
)
return
dis - 1;
if
(vis.ContainsKey(target))
return
int
.MinValue;
vis[target] = 1;
int
a1 =
int
.MinValue;
int
a2 =
int
.MinValue;
int
a3 =
int
.MinValue;
a1 = getmaxdis(target.left, dis + 1, vis,
map);
a2 = getmaxdis(target.right, dis + 1, vis,
map);
a3 = getmaxdis(map[target], dis + 1, vis,
map);
return
Math.Max(Math.Max(a1, a2), a3);
}
public
static
int
minTime(Node root,
int
target)
{
Dictionary<Node, Node> par
=
new
Dictionary<Node, Node>();
getparent(root,
null
, par);
getnode(root, target);
Dictionary<Node,
int
> vis
=
new
Dictionary<Node,
int
>();
return
getmaxdis(n1, 0, vis, par);
}
public
static
void
Main()
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.right.left = newNode(6);
root.left.left.left = newNode(8);
root.left.right.left = newNode(9);
root.left.right.right = newNode(10);
root.left.right.left.left = newNode(11);
int
target = 11;
Console.WriteLine(minTime(root, target));
}
}