C#树的实现

C#数据结构——树的实现

树的简单说明:树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。直观看来,树是以分支关系定义的层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可以用树来形象的表示。树在计算机领域中也得到了广泛的应用,如在编译程序中,可以用树来表示源程序的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。

关键技术

树的抽象数据类型定义包含树的结构定义和基本操作,下面分别进行介绍。
(1)结构定义
树是n(n≥1)个节点的有限集,在任意一棵非空树中,都应该符合以下条件:

  • 有且仅有一个特定的节点称为根的节点;
  • 当n>1时,其余节点可分为m个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。

(2)基本操作
树的基本操作主要包括:构造空树、销毁树、清空树、求树的深度、访问结点、插入子树和删除子树等。

设计过程

(1)打开Visual Studio 开发环境,新建一个类库项目,命名为Arbor。
(2)将“Class1.cs”文件重命名为“Ctree.cs”。
(3)程序主要代码如下:

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;
    }
    /// 
    /// 先序遍历树,用非递归算法实现
    /// 
    /// 非递归实现
    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;
        }
    }
    /// 
    /// 按照先序遍历顺序遍历树
    /// 
    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(baby) == 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);
            }
        }
    }
    /// 
    /// 中序线索化
    /// 
    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;
        }
    }
    /// 
    /// 中序线索化的递归实现
    /// 
    /// 
    private void InThreading(IBinNode t)
    {
        if (t == null)
            return;
        else
        {
            InThreading(t.Left);
        }
    }
}

技巧与心得

树在C#中使用TreeView控件来表示,TreeView控件,又称为树视图控件,它可以为用户显示节点层次结构,而每个节点又可以包含子节点,包含子节点的节点叫父节点,其效果就像在Windows操作系统的Windows资源管理器功能的左窗口中显示文件和文件夹一样。

你可能感兴趣的:(C#)