一棵C#写的树(1)

原创 2002年03月26日 11:07:00

       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 )

设计继承树1

设计继承树1 以狮子、老虎、狗、猫、狼、河马为例设计继承树。步骤如下: 1、找出具有共同属性和行为的对象 这6种动物有什么共同点?这些类型有什么相关性? 这么问有助于执行后面几个步骤。 2、设计...
  • linsheng9731
  • linsheng9731
  • 2013年08月15日 20:58
  • 877

求一棵二叉树的高度

利用递归来求一棵树的高度,基本思想是:对于每一个非空节点,先求取其左子树的高度,然后求取其右子树的高度,最后取两子树中较高的一个加1作为以该节点为根的树的高度;对于空节点,直接返回0就可以了。求整棵树...
  • liao_jian
  • liao_jian
  • 2015年02月07日 08:58
  • 1617

[JZOJ5512] 送你一棵圣诞树

Description 一棵 n 个点的树, 树根为 1. 一开始每个点上有一个 1…n 的颜色 ci, 不同点颜色可以相同. 现在有 q 次操作, 分为两种类型: • 1 u l r:...
  • hzj1054689699
  • hzj1054689699
  • 2018年01月09日 12:21
  • 172

2-3-4树的构造

2-3-4树所有叶子都在同一个层次,也就是说每一层的叶子数目都是相等的,根据这个原理,我们可以将数组: 7,1,2,5,6,9,8,4,3这一堆数字进行构造一棵2-3-4,上图: 1.7 1 2三个数...
  • mengzhisuoliu
  • mengzhisuoliu
  • 2015年03月30日 17:34
  • 974

【JZOJ5512】送你一棵圣诞树

Description一棵 n 个点的树, 树根为 1. 一开始每个点上有一个 1…n 的颜色 ci, 不同点颜色可以相同. 现在有 q 次操作, 分为两种类型: - 1 u l r: 询问子树...
  • sadnohappy
  • sadnohappy
  • 2018年01月11日 16:07
  • 77

生成N个节点随机二叉查找树的函数 具有从1到N的不同的关键字

数据结构与算法分析——c语言描述 练习4.29 本来想用一个长度为N的数组记录是否生成过这个随机数,然后在插入到树中。 看了作者的给的代码瞬间惊讶。还能这样做。 #include...
  • qq789045
  • qq789045
  • 2016年04月23日 21:01
  • 376

ZTree+JAVA写一棵同步树

ZTree在项目中可能经常会用到,通常会用来加载区域树形列表。我们平时用的时候通常会根据效率问题来选择是用同步加载树还是异步加载树,下面我就写一个简单的小例子来展示如何写一个同步树。 前端页面的代码如...
  • yasashii
  • yasashii
  • 2017年07月14日 16:03
  • 208

【SDOI2011】染色

【SDOI2011】染色 【题目描述】 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。 我们将以下面的形式来要求你对这棵树完成一些操作: I.CHANGE u t : 把结...
  • u013554919
  • u013554919
  • 2014年04月09日 08:09
  • 1089

一棵树是否为另一棵树的子结构

题目描述 输入两颗二叉树A,B,判断B是不是A的子结构。 问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0. 分析:这个是百度的一道笔试题目,属于经...
  • yangquanhui1991
  • yangquanhui1991
  • 2016年06月29日 21:45
  • 862

数据结构与算法分析生成N节点随机二叉查找树

/*生成n节点随机二叉查找树,该树具有从1到n的不同关键字*/ #include #include typedef struct Node *Position; typedef struc...
  • qq_28161649
  • qq_28161649
  • 2017年11月21日 15:15
  • 43
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一棵C#写的树(1)
举报原因:
原因补充:

(最多只允许输入30个字)