using
System.Collections;
using
System;
using
System.Collections.Generic;
using
System.Linq;
public
class
Node {
public
int
key;
public
Node left, right;
public
Node(
int
item)
{
key = item;
left = right =
null
;
}
}
public
class
AuxNode {
public
int
key;
public
AuxNode left, right, parent, llNode, rlNode;
public
AuxNode(
int
item)
{
key = item;
left = right = parent = llNode = rlNode =
null
;
}
}
public
class
GFG {
public
static
AuxNode newAuxNode(
int
key)
{
return
new
AuxNode(key);
}
public
static
AuxNode createAuxTree(Node root)
{
if
(root ==
null
)
return
null
;
AuxNode auxTree = newAuxNode(root.key);
auxTree.left = createAuxTree(root.left);
auxTree.right = createAuxTree(root.right);
return
auxTree;
}
public
static
void
makeParentNodePoint(AuxNode auxTree,
AuxNode prev_ptr)
{
if
(auxTree ==
null
)
return
;
if
(prev_ptr !=
null
) {
auxTree.parent = prev_ptr;
}
makeParentNodePoint(auxTree.left, auxTree);
makeParentNodePoint(auxTree.right, auxTree);
}
public
static
void
makeSameLevelNodePoint(AuxNode auxTree)
{
Queue<AuxNode> q =
new
Queue<AuxNode>();
q.Enqueue(auxTree);
while
(q.Count > 0) {
int
qsize = q.Count;
while
(qsize-- > 0) {
AuxNode topEle = q.Peek();
q.Dequeue();
if
(qsize > 0) {
topEle.rlNode = q.Peek();
q.Peek().llNode = topEle;
}
if
(topEle.left !=
null
) {
q.Enqueue(topEle.left);
}
if
(topEle.right !=
null
) {
q.Enqueue(topEle.right);
}
}
}
}
public
static
AuxNode
getTargetNodeAddress(AuxNode auxTree,
int
tNode)
{
if
(auxTree ==
null
)
return
null
;
if
(auxTree.key == tNode) {
return
auxTree;
}
AuxNode is_null
= getTargetNodeAddress(auxTree.left, tNode);
if
(is_null !=
null
)
return
is_null;
return
getTargetNodeAddress(auxTree.right, tNode);
}
public
static
void
printNode(AuxNode auxTree,
AuxNode target_node,
string
pattern)
{
for
(
int
i = 0; i < pattern.Length; i++) {
switch
(pattern[i]) {
case
'p'
:
case
'P'
:
if
(target_node.parent !=
null
) {
target_node = target_node.parent;
}
break
;
case
'l'
:
case
'L'
:
if
(target_node.left !=
null
) {
target_node = target_node.left;
}
break
;
case
'r'
:
case
'R'
:
if
(target_node.right !=
null
)
target_node = target_node.right;
break
;
case
'm'
:
case
'M'
:
if
(target_node.llNode !=
null
)
target_node = target_node.llNode;
break
;
case
'n'
:
case
'N'
:
if
(target_node.rlNode !=
null
)
target_node = target_node.rlNode;
break
;
default
:
return
;
}
}
Console.Write(target_node.key);
}
static
void
printNodeUsingPattern(Node root,
string
pattern,
int
tNode)
{
AuxNode auxTree = createAuxTree(root);
makeParentNodePoint(auxTree,
null
);
makeSameLevelNodePoint(auxTree);
AuxNode target_node
= getTargetNodeAddress(auxTree, tNode);
if
(target_node !=
null
) {
printNode(auxTree, target_node, pattern);
}
else
{
Console.Write(
"-1"
);
}
}
static
void
Main()
{
Node root =
new
Node(10);
root.left =
new
Node(12);
root.right =
new
Node(13);
root.right.left =
new
Node(14);
root.right.right =
new
Node(15);
root.right.left.left =
new
Node(21);
root.right.left.right =
new
Node(22);
root.right.right.left =
new
Node(23);
root.right.right.right =
new
Node(24);
int
target_node = 14;
string
str =
"npmrprrlm"
;
printNodeUsingPattern(root, str, target_node);
}
}