//完成于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("*");
      } 
   }
 } 
}

posted on 2006-01-27 02:21  kirk.net  阅读(597)  评论(0编辑  收藏  举报
free web counter
free web counter