用C#实现数据结构--树(一)

数据|数据结构

数据结构与算法(C#实现)系列---树(一)
                                          Heavenkiller(原创)

首先我们给树下一个定义:

树是一个有限的、非空的结点集,

T={r} or T1 or T2 or…or Tn

它具有下列性质:

1.集合指定的结点r叫做树的根结点

2.其余的结点可以划分成n个子集,T1,T2,…Tn(n>=0),其中每一个子集都是一棵树。

树的其它定义如度,叶子,高等就请大家查阅别的资料吧,到处都有的。

树的主要性质一个就是遍历,分为深度遍历和广度遍历

在这里分别实现为DepthFirstTravesal()和WidthFirstTravesal()

其中深度遍历又分为前序遍历、中序遍历、和后序遍历

这是是采用适配器技术实现的。

using System;

using System.Collections;

namespace DataStructure

{

     /// <summary>

     /// Tree 的摘要说明。

     /// when traverse, traversaltype can't be changed,or throw a  exception

     /// 支持枚举、比较、深度复制

     /// </summary>

     public abstract class Tree:IEnumerable,IComparable

     {

         public Tree()

         {

              //

              // TODO: 在此处添加构造函数逻辑

              //

         }

         protected Queue keyqueue=new Queue();//仅仅用于枚举时存放数据,不参与Equals实现中的比较

         protected TraversalType traversaltype=TraversalType.Breadth;// choose a traversal  type,and  DepthFirst is default

         //protected uint degree=0;//degree of the tree, init  it as 0

         //protected uint height=0;//height of the tree, init it as 0

         //枚举不同的遍历类型

         public enum TraversalType

         {

              Breadth=1,//广度遍历

              PreDepth=2,//前序遍历

              InDepth=3,//中序遍历

              PostDepth=4//后序遍历

             

         };

         //public virtual abstract object  Key{}

        

         public abstract Tree this[uint _index]{get;set;}//if I only use get, can I change it later?

         public  abstract object Key{get;}

         public  abstract uint Degree{get;}

         //public  abstract uint Height{get;}

         public  void SetTraversalType(TraversalType _type){traversaltype=_type;}//set a traversal a type, if it's not set manually, DepthFirst will be chosen in default

         public  abstract bool IsEmpty();// property takes the place of IsEmpty()

         public  abstract bool IsLeaf();

        

         //Only Visit, needn't queue

         public virtual void DepthFirstTraversal(IPrePostVisitor _vis)//middle depthfirst traversal

         {

              //通过_vis使用不同的访问者来进行前序、后序、中序遍历

        

        

              if(!IsEmpty())

              {

                   _vis.PreVisit(this.Key);

                   if( this.Degree>=1 )

                   {

                       if( this.Degree>=2)

                       {

                            for(uint i=0;i<(this.Degree-1);i++)//

                            {

                                 this[i].DepthFirstTraversal(_vis);//recursive call

                                 //_vis.Visit(this.Key);

                            }

                       }

                       this[this.Degree-1].DepthFirstTraversal(_vis);

                   }

                   _vis.PostVisit(this.Key);

              }

             

             

         }

        

         public virtual void BreadthFirstTraversal(IVisitor _vis)//breadth first traversal

         {

              Queue tmpQueue=new Queue();//used to help BreadthFirstTraversal

              //this.keyqueue=new Queue();//store keys

              if(!this.IsEmpty())

                   tmpQueue.Enqueue(this);//enqueue the root node at first

              while(tmpQueue.Count!=0)//until the number of the queue is zero

              {

                   Tree headTree=(Tree)tmpQueue.Dequeue();

                   //this.keyqueue.Enqueue(headTree.Key);

                   _vis.Visit(headTree.Key);

                  

                   for(uint i=0;i<headTree.Degree;i++)

                   {

                       Tree childTree=headTree[i];

                       if(!childTree.IsEmpty())

                            tmpQueue.Enqueue(childTree);

                   }

              }

         }

        

         //------------------------------------------------end------------------------------------

         //内部成员类 用于提供不同遍历类型的访问者

         public class PreOrder:IPrePostVisitor

         {

              private IVisitor visitor;

              public PreOrder(IVisitor _vis){visitor=_vis;}

              #region IPrePostVisitor 成员

              public void PreVisit(object _obj)

              {

                   // TODO:  添加 PreOrder.PreVisit 实现

                   this.visitor.Visit(_obj);

              }

              public void Visit(object _obj)

              {

                   // TODO:  添加 PreOrder.Visit 实现

              }

              public void PostVisit(object _obj)

              {

                   // TODO:  添加 PreOrder.PostVisitor 实现

              }

              #endregion

         }

时间: 2024-10-28 00:48:10

用C#实现数据结构--树(一)的相关文章

c语言-C语言,数据结构,树的孩子兄弟表示法,程序一切正常,但是有个问题不太懂了

问题描述 C语言,数据结构,树的孩子兄弟表示法,程序一切正常,但是有个问题不太懂了 我的困惑就是在creatTree函数中,参数是(LTNode &T),也就是说是struct node**型指针,但是在递归中,也就是在creatTree(T->firstchild)中,T->firstchild应该是struct node*型指针,为什么依然可以运行,且运行正确? printfTree()函数也是一样,我就不再多写了 而在main()函数中,我也只创建了LTNode T;在调用的时候

数据结构~树的遍历(Service层和UI层代码)

问题是这样的,Department表是一个部门表,由DeptId,name和Father组成,它是一种树型的关系,一个部门下可以有多个子部门,同时,它有一个父部门,祖宗部门没有父部门. 以下是测试数据(相当于Data层里取出数据的方法): static List<Department> deptList = new List<Department> { new Department(1,"根",0), new Department(2,"计算机&quo

用C#实现数据结构--树(二)

数据|数据结构 数据结构与算法(C#实现)系列---树(二)                     Heavenkiller(原创)          public class InOrder:IPrePostVisitor          {               private IVisitor visitor;               public InOrder(IVisitor _vis){visitor=_vis;}               #region IPre

C#与数据结构--树论--红黑树(Red Black Tree)(上)

介绍 今天我们来介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees),1978年被Leonidas J. Guibas 和 Robert Sedgewick改成一个比较摩登的名字:红黑树. 红黑树和之前所讲的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能.自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有

python数据结构树和二叉树简介_python

一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:(1)有且仅有一个特定的称为根(Root)的结点:(2)其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,-,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subree). 二.二叉树的定义 二叉树是由n(n≥0)个结点组成的有限集合.每个结点最多有两个子树的有序树

C#与数据结构--树论--红黑树(Red Black Tree)(下)

下面把代码贴出来,如果理解了上面所讲内容是很容易读懂这些代码的. using System; namespace PaintBST { public class RBTree : IBinaryTree //实现画树接口 { //成员变量 private Node _head; //头指针 private Node[] path = new Node[32]; //记录访问路径上的结点 private int p; //表示当前访问到的结点在_path上的索引 INode IBinaryTree

数据结构树-大神,请问哪里不对啊?

问题描述 大神,请问哪里不对啊? #include"iostream" #define n 8 using namespace std; //如何·建立哈夫曼树是一大·难点 typedef struct { int weight; int parent, lchild, rchild; }HTNode, *HuffmanTree; //初始化数组 void Initial_HT(HTNode a[]) { for (int i = 1; i < 2 * n; i++){ a[i]

数据结构:树和二叉树定义和术语

1.树的对象 具有相同特性的数据元素的集合 2.关系 如果没有对象叫做空树 否则: 在存在唯一的成为根的数据元素root 当元素个数大于1的时候,其他节点可以 分为互不相交的树,成为根root的子树         a  b      c    d e f     g             i   j         b c d 叫做a为root节点的子树 e f 叫做以b为root节点的子树 以此类推  3.相关术语 结点:数据元素+若干指向子树的分支       如上数据元素a+指向子树b

浅谈算法和数据结构 九 平衡查找树之红黑树

前面一篇文章介绍了2-3查找树,可以看到,2-3查找树能保证在插入元素之后能保持树的平衡状态,最坏情况下即所有的子节点都是2-node,树的高度为lgN,从而保证了最坏情况下的时间复杂度.但是2-3树实现起来比较复杂,本文介绍一种简单实现2-3树的数据结构,即红黑树(Red-Black Tree) 定义 红黑树的主要是像是对2-3查找树进行编码,尤其是对2-3查找树中的3-nodes节点添加额外的信息.红黑树中将节点之间的链接分为两种不同类型,红色链接,他用来链接两个2-nodes节点来表示一个