using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG
{
public
class
Node
{
public
Node left;
public
int
value;
public
Node right;
public
Node(
int
value)
{
this
.value = value;
left =
null
;
right =
null
;
}
}
private
Boolean firstValueFound =
false
;
private
Boolean secondValueFound =
false
;
private
Stack<Node> stack =
new
Stack<Node>();
private
Node root =
null
;
public
GFG(Node root)
{
this
.root = root;
}
public
Stack<Node> pathBetweenNode(
int
v1,
int
v2)
{
pathBetweenNode(
this
.root, v1, v2);
if
(firstValueFound && secondValueFound)
{
return
stack;
}
return
new
Stack<Node>();
}
private
void
pathBetweenNode(Node root,
int
v1,
int
v2)
{
if
(root ==
null
)
return
;
if
(firstValueFound && secondValueFound)
return
;
Boolean isAddedToStack =
false
;
if
(firstValueFound ^ secondValueFound)
{
stack.Push(root);
isAddedToStack =
true
;
}
if
(!(firstValueFound && secondValueFound))
{
pathBetweenNode(root.left, v1, v2);
}
Boolean localFirstValueFound = firstValueFound;
Boolean localSecondValueFound = secondValueFound;
if
(root.value == v1)
firstValueFound =
true
;
if
(root.value == v2)
secondValueFound =
true
;
Boolean localAdded =
false
;
if
(((firstValueFound ^ secondValueFound)
|| ((localFirstValueFound ^ localSecondValueFound)
&& (firstValueFound && secondValueFound)))
&& !isAddedToStack)
{
localAdded =
true
;
stack.Push(root);
}
if
(!(firstValueFound && secondValueFound))
{
pathBetweenNode(root.right, v1, v2);
}
if
((firstValueFound ^ secondValueFound)
&& !isAddedToStack && !localAdded)
stack.Push(root);
if
((firstValueFound ^ secondValueFound)
&& isAddedToStack)
stack.Pop();
}
private
static
void
print(Stack<Node> stack)
{
if
(stack.Count==0)
return
;
int
value = stack.Pop().value;
print(stack);
Console.Write(value +
" "
);
}
public
static
void
Main(String []args)
{
Node root =
new
Node(0);
root.left =
new
Node(1);
root.right =
new
Node(2);
root.left.left =
new
Node(3);
root.left.right =
new
Node(4);
root.right.left =
new
Node(5);
root.right.right =
new
Node(6);
root.left.left.left =
new
Node(7);
root.left.right.left =
new
Node(8);
root.left.right.right =
new
Node(9);
GFG pathBetweenNodes =
new
GFG(root);
Stack<Node> stack
= pathBetweenNodes.pathBetweenNode(7, 4);
print(stack);
}
}