//完成于2005.12,大三上学期课程设计
//二叉排序树的生成,查找,排序显示,删除节点
using System;
namespace kirk
{
public class BtNode
{
public int Data;
public BtNode Lchild;
public BtNode Rchild;
public BtNode()
{
Lchild=Rchild=null;
}
}
public class Tree
{
public BtNode Root;
// bool Temp=false;
public Tree()
{
Root=null;
}
////构造
public void Insert(int Data)
{
if(Root==null)
{
Root=new BtNode();
Root.Data=Data;
}
else
{
Insert(Root,Data);
}
}
////插入元素
public void Insert(BtNode Root,int Data)
{
if(Root.Data>Data)
{
if(Root.Lchild==null)
{
BtNode Temp=new BtNode();
Temp.Data=Data;
Root.Lchild=Temp;
}
else
{
Insert(Root.Lchild,Data);
}
}
else
{
if(Root.Rchild==null)
{
BtNode Temp=new BtNode();
Temp.Data=Data;
Root.Rchild=Temp;
}
else
{
Insert(Root.Rchild,Data);
}
}
}
////插入元素递归
public bool Search(int Data)
{
bool temp = false;
if(Root.Data == Data)
{
temp = true;
Console.WriteLine("找到了,耶...");
}
else
{
temp = Search(Root,Data);
}
return temp;
}
/////查找元素
public bool Search(BtNode node,int Data)
{
bool temp=false;
if(node.Data == Data)
{
temp = true;
Console.WriteLine("找到了,耶...");
}
else
{
if(node.Data > Data)
{
if(node.Lchild != null)
temp=Search(node.Lchild,Data);
}
else
{
if(node.Rchild != null)
temp=Search(node.Rchild,Data);
}
}
return temp;
}
/////查找元素递归
//获得该节点最小右子女,用于删除元素使用
BtNode Min(BtNode parent)
{
BtNode temp = parent;
while(temp != null)
{
if(temp.Lchild == null)
return temp;
else
temp = temp.Lchild;
}
return null;
}
/// 删除元素
public void Remove(int Data)
{
if (Root == null)
return;
if(Root.Data == Data)
{
BtNode tmp = Min(Root.Rchild);
if(tmp == null)
{
Root = Root.Lchild;
}
else
{
Root.Data = tmp.Data;
Remove(Root,Root.Rchild,1,tmp.Data);
}
}
else if(Root.Data<Data)
{
Remove(Root,Root.Rchild,1,Data);
}
else
Remove(Root,Root.Lchild,0,Data);
}
///
/// 删除元素递归
private void Remove(BtNode parent,BtNode cur,int direction,int Data)
{
if(cur.Data == Data)
{
if(cur.Lchild == null)
{
if(direction == 0)
parent.Lchild = cur.Rchild;
else
parent.Rchild = cur.Rchild;
}
else if(cur.Rchild == null)
{
if(direction == 0)
parent.Lchild = cur.Lchild;
else
parent.Rchild = cur.Lchild;
}
else
{
BtNode tmp =Min(cur.Rchild);
cur.Data = tmp.Data;
Remove(cur,cur.Rchild,1,tmp.Data);
}
}
else if(cur.Data > Data)
{
Remove(cur,cur.Lchild,0,Data);
}
else
{
Remove(cur,cur.Rchild,1,Data);
}
}
public void CreateTree()
{
string Command;
Console.WriteLine("请输入数据产生二叉排序数,数据间以回车为间隔,ok结束");
while((Command=Console.ReadLine())!="ok")
{
Insert(int.Parse(Command));
}
}
public void Sort(BtNode Root)
{
if(Root==null)
{
Console.WriteLine("树为空");
}
else
{
if(Root.Lchild!=null)
{
Sort(Root.Lchild);
Console.Write("{0},",Root.Data);
if(Root.Rchild!=null)
{
Sort(Root.Rchild);
}
}
else
{
Console.Write("{0},",Root.Data);
if(Root.Rchild!=null)
{
Sort(Root.Rchild);
}
}
}
}
}
public class kirk
{
public static void Main()
{
Console.WriteLine("");
int t=28;
print(t);
Console.Write("Work by ZeroSun kirk.net");
print(t);
Console.WriteLine("");
Console.WriteLine("C# 无指针实现二叉查找树");
Console.WriteLine("");
Tree FirstTree=new Tree();
int n=0;
do
{
Console.WriteLine("创建树1_查找元素2_插入元素3_删除元素4_排序5_退出6");
Console.Write("您的选择是: ");
string s = Console.ReadLine();
n = int.Parse(s);
switch( n )
{
case 1:
{
FirstTree.CreateTree();
break;
}
case 2:
{
Console.Write("请输入要查找的数据:");
string S_Data=Console.ReadLine();
int intS_Data=int.Parse(S_Data);
if(FirstTree.Search(FirstTree.Root,intS_Data))
{
Console.WriteLine("此数据存在");
}
else
{
Console.WriteLine("此数据不存在,如果需要,请插入");
}
break;
}
case 3:
{
Console.Write("请输入要插入的数据:");
string I_Data=Console.ReadLine();
int intI_Data=int.Parse(I_Data);
FirstTree.Insert(intI_Data);
Console.WriteLine("插入成功");
break;
}
case 4:
{
Console.Write("请输入要删除的数据:");
string R_Data=Console.ReadLine();
int intR_Data=int.Parse(R_Data);
FirstTree.Remove(intR_Data);
Console.WriteLine("删除成功");
break;
}
case 5:
{
FirstTree.Sort(FirstTree.Root);
Console.WriteLine("排序完成");
break;
}
case 6:
{
break;
}
default:
{
break;
}
}
}while(n!=6);
Console.WriteLine("已推出");
//
}
public static void print(int t)
{
for(int i=0;i<t;i++)
{
Console.Write("*");
}
}
}
}