using
System;
using
System.Collections.Generic;
public
class
Node {
public
int
data;
public
Node left, right;
public
Node(
int
data) {
this
.data = data;
left = right =
null
;
}
}
class
MainClass {
static
Node newNode(
int
data) {
Node n =
new
Node(data);
n.right =
null
;
n.left =
null
;
return
n;
}
static
List<
int
> leftBottomTopRightTraversal(Node root) {
List<
int
> rr =
new
List<
int
>();
Stack<
int
> r =
new
Stack<
int
>();
Queue<Node> roots =
new
Queue<Node>();
roots.Enqueue(root);
Node lyr_root = root;
while
(roots.Count > 0) {
Node n = roots.Dequeue();
if
(lyr_root == n) {
while
(r.Count > 0) {
rr.Add(r.Peek());
r.Pop();
}
}
while
(n !=
null
) {
if
(n.right !=
null
) {
if
(n == lyr_root) {
lyr_root = n.right;
}
roots.Enqueue(n.right);
}
r.Push(n.data);
n = n.left;
}
}
while
(r.Count > 0) {
rr.Add(r.Peek());
r.Pop();
}
return
rr;
}
public
static
Node buildBinaryTree(
string
input) {
if
(input ==
null
|| input.Length == 0) {
return
null
;
}
string
[] values = input.Trim().Split(
' '
);
if
(values.Length == 0) {
return
null
;
}
Node root =
new
Node(
int
.Parse(values[0]));
Queue<Node> queue =
new
Queue<Node>();
queue.Enqueue(root);
for
(
int
i = 1; i < values.Length; i += 2) {
Node parent = queue.Dequeue();
if
(!values[i].Equals(
"N"
)) {
Node left =
new
Node(
int
.Parse(values[i]));
parent.left = left;
queue.Enqueue(left);
}
if
(i + 1 < values.Length && !values[i+1].Equals(
"N"
)) {
Node right =
new
Node(
int
.Parse(values[i+1]));
parent.right = right;
queue.Enqueue(right);
}
}
return
root;
}
static
void
Main() {
string
T =
"2 7 5 2 6 N 9 N N 5 11 4 N"
;
Node root = buildBinaryTree(T);
List<
int
> result = leftBottomTopRightTraversal(root);
for
(
int
i = 0; i < result.Count; i++) {
Console.Write(result[i] +
" "
);
}
}
}