using
System;
public
class
Node
{
public
int
Data {
get
;
set
; }
public
Node Left {
get
;
set
; }
public
Node Right {
get
;
set
; }
public
Node(
int
data)
{
Data = data;
Left = Right =
null
;
}
}
public
class
BinarySearchTree
{
public
Node Root {
get
;
set
; }
public
BinarySearchTree()
{
Root =
null
;
}
public
void
Insert(
int
data)
{
Root = InsertNode(Root, data);
}
private
Node InsertNode(Node node,
int
data)
{
if
(node ==
null
)
{
Root =
new
Node(data);
return
Root;
}
if
(data < node.Data)
node.Left = InsertNode(node.Left, data);
else
node.Right = InsertNode(node.Right, data);
return
node;
}
private
class
Counter
{
private
readonly
BinarySearchTree outerInstance;
public
Counter(BinarySearchTree outerInstance)
{
this
.outerInstance = outerInstance;
}
public
int
Count {
get
;
set
; }
}
private
void
FindSecondLargestElement(Node node, Counter counter)
{
if
(node ==
null
|| counter.Count >= 2)
return
;
FindSecondLargestElement(node.Right, counter);
counter.Count++;
if
(counter.Count == 2)
{
Console.Write(
"The 2nd largest element is "
+ node.Data);
return
;
}
FindSecondLargestElement(node.Left, counter);
}
public
void
GetSecondLargestNode(Node node)
{
Counter counter =
new
Counter(
this
);
FindSecondLargestElement(Root, counter);
}
public
static
void
Main(
string
[] args)
{
BinarySearchTree bst =
new
BinarySearchTree();
bst.Insert(50);
bst.Insert(30);
bst.Insert(20);
bst.Insert(40);
bst.Insert(70);
bst.Insert(60);
bst.Insert(80);
bst.GetSecondLargestNode(bst.Root);
}
}