import
java.util.*;
class
GFG
{
static
class
INT
{
int
a;
}
static
class
Node
{
int
data;
Node left, right;
};
static
Node newNode(
int
data)
{
Node node =
new
Node();
node.data = data;
node.left = node.right =
null
;
return
(node);
}
static
int
height(Node root)
{
if
(root ==
null
)
return
0
;
int
lheight = height(root.left);
int
rheight = height(root.right);
return
Math.max(lheight, rheight) +
1
;
}
static
void
rightToLeft(Node root,
int
level, INT f)
{
if
(root ==
null
)
return
;
if
(level ==
1
&& f.a ==
0
)
{
System.out.printf(
"%d "
, root.data);
f.a =
1
;
}
else
if
(level >
1
)
{
rightToLeft(root.right, level -
1
, f);
rightToLeft(root.left, level -
1
, f);
}
}
static
void
leftToRight(Node root,
int
level, INT f)
{
if
(root ==
null
)
return
;
if
(level ==
1
&& f.a ==
1
)
{
System.out.printf(
"%d "
, root.data);
f.a =
0
;
}
else
if
(level >
1
)
{
leftToRight(root.left, level -
1
, f);
leftToRight(root.right, level -
1
, f);
}
}
static
void
printExtremeNodes(Node root)
{
int
h = height(root);
int
flag =
0
;
INT f=
new
INT();
f.a =
0
;
for
(
int
i =
1
; i <= h; i++)
{
if
(flag ==
0
)
{
rightToLeft(root, i, f);
flag =
1
;
}
else
if
(flag ==
1
)
{
leftToRight(root, i, f);
flag =
0
;
}
}
return
;
}
public
static
void
main(String args[])
{
Node root = newNode(
1
);
root.left = newNode(
2
);
root.right = newNode(
3
);
root.left.left = newNode(
4
);
root.left.right = newNode(
5
);
root.right.right = newNode(
7
);
root.left.left.left = newNode(
8
);
root.left.left.right = newNode(
9
);
root.left.right.left = newNode(
10
);
root.left.right.right = newNode(
11
);
root.right.right.left = newNode(
14
);
root.right.right.right = newNode(
15
);
root.left.left.left.left = newNode(
16
);
root.left.left.left.right = newNode(
17
);
root.right.right.right.right = newNode(
31
);
printExtremeNodes(root);
}
}