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 { const int INIT_TREE_SIZE=20; private IBinNode tree; private BinNodeLine head; //线索化后的头指针 private IBinNode prenode; //指向最近访问过的前驱节点 public TravelBinTree() { tree = new BinNodePtr(); } public TravelBinTree(IBinNode INode) { tree = INode; } /// <summary> /// 先序遍历树,用非递归算法实现 /// </summary> /// <remarks>非递归实现</remarks> public void PreOrderTravel() { IBinNode temptree; Stack stk = new Stack(INIT_TREE_SIZE); if(tree == null) throw(new InvalidOperationException("访问的树为空")); temptree = tree; stk.Push(tree); while(stk.Count!=0) { while(temptree!=null) { Print(temptree); stk.Push(temptree.Left); temptree = temptree.Left; } stk.Pop(); // 空指针退栈 if(stk.Count != 0) { temptree=(IBinNode)stk.Pop(); stk.Push(temptree.Right); temptree = temptree.Right; } } } public void InOrderTravel() { InOrderTravel(tree); } private void InOrderTravel(IBinNode t) { if(t==null) return; InOrderTravel(t.Left); Print(t); InOrderTravel(t.Right); } public void RevOrderTravel() { RevOrderTravel(tree); } private void RevOrderTravel(IBinNode t) { if(t==null) return; RevOrderTravel(t.Left); RevOrderTravel(t.Right); Print(t); } public void Print(IBinNode t) { Console.Write(t.Element + ","); } public void Insert(IBinNode node,Position pos) { if(node == null) throw(new InvalidOperationException("不能将空节点插入树")); switch(pos) { case Position.LEFT : tree.Left = node;break; case Position.RIGHT: tree.Right = node;break; } } /// <summary> /// 按照先序遍历顺序遍历树 /// </summary> public void TreeBuilder() { Stack stk = new Stack(INIT_TREE_SIZE); stk.Push(tree); Position pos; string para; pos = Position.LEFT; IBinNode baby,temp; while(true) { para = Console.ReadLine(); if(para == "") { if(pos == Position.RIGHT) { stk.Pop(); while(stk.Count!=0 && ((IBinNode)stk.Peek()).Right!=null) stk.Pop(); if(stk.Count ==0) break; } else pos = Position.RIGHT; } else { if(tree.GetType().Equals()==true) baby = new BinNodePtr(para); temp = (IBinNode)stk.Peek(); if(pos == Position.LEFT) temp.Left = baby; else temp.Right = baby; pos = Position.LEFT; stk.Push(baby); } }
} /// <summary> /// 中序线索化 /// </summary> public void InOrderThreading() { head = new BinNodeLine(""); head.RTag = Tag.THREAD; head.Right = head; if(tree == null) head.Left = head; else { head.Left = tree; prenode = head;
} } /// <summary> /// 中序线索化的递归实现 /// </summary> /// <param name="t"></param> private void InThreading(IBinNode t) { if(t==null) return; else { InThreading(t.Left); // if(left } } } /// <summary> /// Summary description for Class1. /// </summary> class Class1 { /// <summary> /// 测试控制台 /// </summary> /// <param name="args"></param> static void Main(string[] args) { string para = null; para = Console.ReadLine(); BinNodePtr root = new BinNodePtr(para); TravelBinTree t = new TravelBinTree(root); t.TreeBuilder(); t.PreOrderTravel(); Console.WriteLine(""); t.InOrderTravel(); Console.WriteLine(""); t.RevOrderTravel(); } } }
非常希望和大家交流( he_x@263.net )
|