using
System;
using
System.Collections.Generic;
public
class
TreeNode
{
public
int
data;
public
TreeNode left =
null
;
public
TreeNode right =
null
;
public
TreeNode(
int
data)
{
this
.data = data;
}
}
public
class
BinaryTreeDeleteKNode{
public
TreeNode insert(TreeNode root,
int
value)
{
if
(root ==
null
)
{
root =
new
TreeNode(value);
return
root;
}
Queue<TreeNode> q =
new
Queue<TreeNode>();
q.Enqueue(root);
while
(q.Count!=0)
{
TreeNode tn = q.Dequeue();
if
(tn.left !=
null
)
{
q.Enqueue(tn.left);
}
else
{
tn.left =
new
TreeNode(value);
return
root;
}
if
(tn.right !=
null
)
{
q.Enqueue(tn.right);
}
else
{
tn.right =
new
TreeNode(value);
return
root;
}
}
return
root;
}
public
void
levelOrder(TreeNode root)
{
if
(root ==
null
)
{
Console.WriteLine(
"Tree is empty!!"
);
}
Queue<TreeNode> q =
new
Queue<TreeNode>();
q.Enqueue(root);
while
(q.Count!=0)
{
TreeNode tn = q.Dequeue();
Console.Write(tn.data +
" "
);
if
(tn.left !=
null
)
q.Enqueue(tn.left);
if
(tn.right !=
null
)
q.Enqueue(tn.right);
}
}
public
TreeNode deleteIn(TreeNode root,
int
k)
{
if
(root ==
null
)
return
root;
TreeNode searchedNode =
null
;
TreeNode tn =
null
;
Queue<TreeNode> q =
new
Queue<TreeNode>();
TreeNode deepestNodeParent =
null
;
q.Enqueue(root);
while
(q.Count!=0)
{
bool
isParent =
false
;
tn = q.Dequeue();
if
(searchedNode ==
null
&& tn.data == k)
{
searchedNode = tn;
}
if
(tn.left !=
null
)
{
q.Enqueue(tn.left);
isParent =
true
;
}
if
(tn.right !=
null
)
{
q.Enqueue(tn.right);
isParent =
true
;
}
if
(isParent) deepestNodeParent = tn;
}
if
(searchedNode ==
null
)
{
Console.Write(
"Node with value '"
+ k +
"' not exists."
);
return
root;
}
searchedNode.data = tn.data;
if
(deepestNodeParent !=
null
&&
deepestNodeParent.left !=
null
&&
deepestNodeParent.left.data == tn.data)
{
deepestNodeParent.left =
null
;
}
else
{
deepestNodeParent.right =
null
;
}
return
root;
}
public
static
void
Main()
{
TreeNode node =
null
;
BinaryTreeDeleteKNode binaryTreeDeleteKNode =
new
BinaryTreeDeleteKNode();
node = binaryTreeDeleteKNode.insert(node, 1);
node = binaryTreeDeleteKNode.insert(node, 8);
node = binaryTreeDeleteKNode.insert(node, 3);
node = binaryTreeDeleteKNode.insert(node, 4);
node = binaryTreeDeleteKNode.insert(node, 5);
node = binaryTreeDeleteKNode.insert(node, 6);
node = binaryTreeDeleteKNode.insert(node, 7);
Console.Write(
"Original Tree: "
);
binaryTreeDeleteKNode.levelOrder(node);
node = binaryTreeDeleteKNode.deleteIn(node,8);
Console.Write(
"\nDeleting node with key 8: "
);
binaryTreeDeleteKNode.levelOrder(node);
node = binaryTreeDeleteKNode.deleteIn(node,1);
Console.Write(
"\nDeleting node with key 1: "
);
binaryTreeDeleteKNode.levelOrder(node);
node = binaryTreeDeleteKNode.deleteIn(node,4);
Console.Write(
"\nDeleting node with key 4: "
);
binaryTreeDeleteKNode.levelOrder(node);
}
}