日期:2009-06-27  浏览次数:20524 次

C#的确是一个很好的面向对象语言,我看《数据结构(第二版)》那本书应该出本用C#描述的版本。下面是我用C#写的一棵树。先用接口把节点做了抽象定义,这样在实现遍历,插入等操作的时候只对接口进行操作。在程序中,我尽量使用C#的特性,如接口,属性,玫举,这样代码虽然看起来比较冗长,但是,当代码越来越长的时候,你就会从中看到优点,因为合理的结构让你永远思路清晰。这课树我只能算写了一个开头,因为如果要把所有类型的树和加在他们之上的算法都写出来,我看没有1~2k 行程序是绝对不行的,不过,只要有时间,我一定会继续写的,同时希望大家也写,把这个代码库完善起来。
using System;
using System.Collections;
///
/// author 何潇(sailer)( he_x@263.net )
///
namespace Tree
{
/// <summary>
/// LEFT左子树,RIGHT右子树
/// </summary>
enum Position{LEFT,RIGHT};
/// <summary>
/// LINK指向孩子,THREAD指向后继
/// </summary>
enum Tag{LINK,THREAD};
/// <summary>
/// 二叉树节点的抽象定义
/// </summary>
interface IBinNode
{
  bool isLeaf();
  object Element{get;set;}
  IBinNode Left{get;set;}
  IBinNode Right{get;set;}
}

/// <summary>
/// 遍历,线索化等操作的接口
/// </summary>
interface ITravelBinTree
{
  void PreOrderTravel();
  void InOrderTravel();
  void RevOrderTravel();
  void Print(IBinNode t);
}
interface IInsertBinTree
{
  void Insert(IBinNode node,Position pos);
}
/// <summary>
/// Normal actualize of bintree
/// </summary>
class BinNodePtr : IBinNode
{
  protected object element;
  protected IBinNode lchild;
  protected IBinNode rchild;
  public BinNodePtr(object e,IBinNode left,IBinNode right)
  {
   element = e;
   lchild = left;
   rchild = right;
  }
  public BinNodePtr(object e)
  {
   element = e;
   lchild = rchild = null;
  }
  public BinNodePtr()
  {
   element = null;
   lchild = rchild =null;
  }
  public bool isLeaf()
  {
   if(lchild==null && rchild==null)
    return true;
   return false;
  }
  public object Element
  {
   get{return element;}
   set{element = value;}
  }
  public IBinNode Left
  {
   get
   {
    return lchild;
   }
   set
   {
    lchild = value;
   }
  }
  public IBinNode Right
  {
   get
   {
    return rchild;
   }
   set
   {
    rchild = value;
   }
  }
}
class BinNodeLine : BinNodePtr,IBinNode
{
  private Tag ltag,rtag;
  public BinNodeLine(object e,IBinNode left,IBinNode right) :base(e,left,right)
  {ltag = rtag = Tag.LINK;}
  public BinNodeLine(object e) : base(e)
  {ltag = rtag = Tag.LINK;}
  public Tag LTag
  {
   get{return ltag;}
   set{ltag = value;}
  }
  public Tag RTag
  {
   get{return rtag;}
   set{rtag = value;}
  }
}
class TravelBinTree : ITravelBinTree,IInsertBinTree