C# 之二叉树的实现

什么是二叉树呢?

二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。如图所示:


这就是个一般我们看到的二叉树了。那么我们怎么设计我们自己的二叉树呢??

根据二叉树的定义,一个节点下最多有两个子节点,向上亦是如此。。故我们可以这样来定义我们的节点,因为树是由很多个节点组成的,我们要做的就是把多个节点拼成一棵二叉树。

定义二叉树的节点:

 //定义树节点
    class TreeNode
    {
        public int data;
        public TreeNode lchild;
        public TreeNode rchild;


        public TreeNode() { }
        public TreeNode(int value, TreeNode l, TreeNode r)
        {
            this.data = value;
            this.lchild = l;
            this.rchild = r;
        }
    }

其中包括一个数据域,以及两个子节点。好了树的节点我们就定义好了,虽然很多个节点就是一棵树了,但是为了更见直观,我们还需要定义一棵“树”,如下所示:

 //定义树
    class Btree
    {
        //树节点个数
        public int num;
        public TreeNode node;


        public Btree() { }


        public Btree(int count, TreeNode t)
        {
            this.num = count;
            this.node = t;
        }

    }


简单的来说,这就是一个树的头,里面包括了节点的总个数和根结点。

那么  我们怎么创建一棵树呢??

如定义所示,利用构造函数创建我们的树。

 //创建新节点
            TreeNode node = new TreeNode();
            node.data = 1;
            node.lchild = new TreeNode()
                            {
                                data = 2,
                                lchild = new TreeNode() { data = 4, lchild = null, rchild = null },
                                rchild = new TreeNode(){data = 5, lchild = null, rchild = null}
                            };
            node.rchild = new TreeNode()
                        {
                            data = 3,
                            lchild = new TreeNode() { data = 6, lchild = null, rchild = null }
                        };
            //创建树
            Btree bt = new Btree();
            bt.num = 6;

       bt.node = node;

这样  我们就创建好了一棵树, 那么 问题来了。。。。。我们怎么把这棵树打印出来呢???

遍历节点?? 怎么遍历呢?

下面为大家推荐一个很直观的打印二叉树的办法:

 //结构化打印二叉树
        public void ShowTree(TreeNode node, int format, int gap, char div)
        {
            if (node != null)
            {
                //打印我们定义的结构字符
                for (int i = 0; i < format; i++)
                {
                    Console.Write(div);
                }
                //父节点打印换行
                Console.WriteLine(node.data); 


                if ((node.lchild != null) || (node.rchild != null))
                {
                    //打印子节点
                    ShowTree(node.lchild, format + gap, gap, div);
                    ShowTree(node.rchild, format + gap, gap, div);
                }
            }
            else 
            {
                for (int i = 0; i < format; i++)
                {
                    Console.Write(div);
                }
                Console.WriteLine();
            }

        }

运行上面的程序如下图所示:



大家有没有看出点什么来呢?? 相信大家好好看一下  还是能看得懂的!!!

好了,二叉树的创建就先讲到这里,下一篇为大家介绍二叉树的插入。。节点的删除。遍历等等。。。


猜你喜欢

转载自blog.csdn.net/qq_24391357/article/details/80199040