import
java.util.ArrayList;
import
java.util.LinkedList;
import
java.util.Queue;
class
Node {
int
val;
Node left, right;
public
Node(
int
val)
{
this
.val = val;
this
.left =
null
;
this
.right =
null
;
}
}
public
class
BinaryTreePropagationTime {
static
Node node =
null
;
public
static
Node newNode(
int
val)
{
Node temp =
new
Node(val);
return
temp;
}
public
static
void
findParent(Node root, Node p,
ArrayList<Node> parent,
int
start)
{
if
(root ==
null
)
return
;
parent.set(root.val, p);
if
(root.val == start) {
node = root;
}
findParent(root.left, root, parent, start);
findParent(root.right, root, parent, start);
}
public
static
int
amountOfTime(Node root,
int
start)
{
ArrayList<Node> parent =
new
ArrayList<>();
for
(
int
i =
0
; i <
100005
; i++) {
parent.add(
null
);
}
findParent(root,
null
, parent, start);
boolean
[] visited =
new
boolean
[
100005
];
Queue<Node> q =
new
LinkedList<>();
q.add(node);
visited[start] =
true
;
int
result = -
1
;
while
(!q.isEmpty()) {
int
n = q.size();
for
(
int
i =
0
; i < n; i++) {
Node curr = q.poll();
int
currNode = curr.val;
if
(parent.get(currNode) !=
null
&& !visited[parent.get(currNode).val]) {
visited[parent.get(currNode).val]
=
true
;
q.add(parent.get(currNode));
}
if
(curr.left !=
null
&& !visited[curr.left.val]) {
visited[curr.left.val] =
true
;
q.add(curr.left);
}
if
(curr.right !=
null
&& !visited[curr.right.val]) {
visited[curr.right.val] =
true
;
q.add(curr.right);
}
}
result++;
}
return
result;
}
public
static
void
main(String[] args)
{
Node root = newNode(
11
);
root.left = newNode(
12
);
root.right = newNode(
13
);
root.right.left = newNode(
14
);
root.right.right = newNode(
15
);
root.right.left.left = newNode(
21
);
root.right.left.right = newNode(
22
);
root.right.right.left = newNode(
23
);
root.right.right.right = newNode(
24
);
int
start =
14
;
int
result = amountOfTime(root, start);
System.out.println(result);
}
}