using
System;
namespace
BinaryTreeDeletion {
public
class
TreeNode {
public
int
Data;
public
TreeNode leftNode;
public
TreeNode rightNode;
}
public
class
BinaryTreeOperations {
TreeNode rootNode;
TreeNode parentNode;
int
NodeToDelete;
int
NodeToBeReplaceWith;
bool
NodeValueReplaced =
false
;
public
static
void
Main()
{
BinaryTreeOperations obj
=
new
BinaryTreeOperations();
obj.AddNode(7);
obj.AddNode(2);
obj.AddNode(3);
obj.AddNode(1);
obj.AddNode(10);
obj.AddNode(5);
obj.AddNode(8);
Console.WriteLine(
"Inorder Traversal before Deletion : "
);
obj.PrintInorderTraversalData(obj.rootNode);
obj.DeleteNode(5);
Console.WriteLine(
""
);
Console.WriteLine(
"Inorder Traversal after Deletion : "
);
obj.PrintInorderTraversalData(obj.rootNode);
}
void
PrintInorderTraversalData(TreeNode Node)
{
if
(Node !=
null
) {
PrintInorderTraversalData(Node.leftNode);
Console.Write(Node.Data +
" "
);
PrintInorderTraversalData(Node.rightNode);
}
}
public
void
AddNode(
int
Value)
{
TreeNode beforeNode =
null
;
TreeNode afterNode =
this
.rootNode;
while
(afterNode !=
null
) {
beforeNode = afterNode;
if
(Value < afterNode.Data)
afterNode = afterNode.leftNode;
else
if
(Value > afterNode.Data)
afterNode = afterNode.rightNode;
else
return
;
}
TreeNode newNode =
new
TreeNode();
newNode.Data = Value;
if
(
this
.rootNode ==
null
)
rootNode = newNode;
else
{
if
(Value < beforeNode.Data) {
beforeNode.leftNode = newNode;
}
else
{
beforeNode.rightNode = newNode;
}
}
}
void
DeleteNode(
int
Value)
{
if
(rootNode ==
null
) {
return
;
}
NodeToBeReplaceWith = FindDeepestNode(rootNode);
NodeToDelete = Value;
Search(rootNode);
}
int
FindDeepestNode(TreeNode rootnode)
{
if
(rootnode.leftNode ==
null
&& rootnode.rightNode ==
null
) {
int
deepestVal = rootnode.Data;
parentNode.leftNode =
null
;
parentNode.rightNode =
null
;
return
deepestVal;
}
parentNode = rootnode;
return
FindDeepestNode(rootnode.rightNode !=
null
? rootnode.rightNode
: rootnode.leftNode);
}
void
Search(TreeNode node)
{
if
(!NodeValueReplaced) {
SearchAndReplace(node.leftNode);
}
if
(!NodeValueReplaced) {
SearchAndReplace(node.rightNode);
}
}
void
SearchAndReplace(TreeNode rootnode)
{
if
(rootnode ==
null
) {
return
;
}
if
(rootnode.Data == NodeToDelete) {
rootnode.Data = NodeToBeReplaceWith;
NodeValueReplaced =
true
;
return
;
}
if
(!NodeValueReplaced) {
SearchAndReplace(rootnode.leftNode);
}
if
(!NodeValueReplaced) {
SearchAndReplace(rootnode.rightNode);
}
}
}
}