using
System.Collections.Generic;
using
System;
class
GFG
{
public
class
Node
{
public
int
data;
public
Node left, right, root;
public
Node(
int
data)
{
this
.data = data;
}
}
public
static
Node AddNode(Node root,
int
data)
{
if
(root ==
null
)
{
root =
new
Node(data);
return
root;
}
if
(root.data < data)
root.right = AddNode(root.right, data);
else
if
(root.data > data)
root.left = AddNode(root.left, data);
return
root;
}
public
static
void
TargetPair(Node node,
int
tar)
{
List<Node> LeftList =
new
List<Node>();
List<Node> RightList =
new
List<Node>();
Node curr_left = node;
Node curr_right = node;
while
(curr_left !=
null
|| curr_right !=
null
|| LeftList.Count > 0 && RightList.Count > 0)
{
while
(curr_left !=
null
)
{
LeftList.Add(curr_left);
curr_left = curr_left.left;
}
while
(curr_right !=
null
)
{
RightList.Add(curr_right);
curr_right = curr_right.right;
}
Node LeftNode = LeftList[LeftList.Count - 1];
Node RightNode = RightList[RightList.Count - 1];
int
leftVal = LeftNode.data;
int
rightVal = RightNode.data;
if
(leftVal >= rightVal)
break
;
if
(leftVal + rightVal < tar)
{
LeftList.RemoveAt(LeftList.Count - 1);
curr_left = LeftNode.right;
}
else
if
(leftVal + rightVal > tar)
{
RightList.RemoveAt(RightList.Count - 1);
curr_right = RightNode.left;
}
else
{
Console.WriteLine(LeftNode.data +
" "
+ RightNode.data);
RightList.RemoveAt(RightList.Count - 1);
LeftList.RemoveAt(LeftList.Count - 1);
curr_left = LeftNode.right;
curr_right = RightNode.left;
}
}
}
public
static
void
Main(String[] b)
{
Node root =
null
;
root = AddNode(root, 2);
root = AddNode(root, 6);
root = AddNode(root, 5);
root = AddNode(root, 3);
root = AddNode(root, 4);
root = AddNode(root, 1);
root = AddNode(root, 7);
int
sum = 8;
TargetPair(root, sum);
}
}