C# 二叉树的实现

闲来无事,最近用C#实现了数据结构的二叉树 其中包括排序二叉树的实现。

首先来看一下二叉树节点的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace LinkBiTree
{
    public class BiTreeNode<T> where T:IComparable<T>
    {
        //定义数据域
        private T data;
        //定义二叉树的左孩子节点
        private BiTreeNode<T> lChild;
        //定义右孩子节点
        private BiTreeNode<T> rChild;

        //构造函数
        //含三参的构造函数
        public BiTreeNode(T val,BiTreeNode<T> lc,BiTreeNode<T> rc)
        {
            data = val;
            lChild = lc;
            rChild = rc;
        }
        //含俩参的构造函数
        public BiTreeNode(BiTreeNode<T> lc, BiTreeNode<T> rc)
        {
            data=default(T);
            lChild = lc;
            rChild = rc;
        }
        //含一参的构造函数
        public BiTreeNode(T val)
        {
            data = val;
            lChild = null;
            rChild = null;
        }
        //无参的构造函数
        public BiTreeNode()
        {
            data = default(T);
            lChild = null;
            rChild = null;
        }

        //数据域属性
        public T Data
        {
            get
            {
                return data;
            }

            set
            {
                data = value;
            }
        }

        //左孩子域
        public BiTreeNode<T> LChild
        {
            get
            {
                return lChild;
            }
            set
            {
                lChild = value;
            }
        }
        //右孩子域属性
        public BiTreeNode<T> RChild
        {
            get
            {
                return rChild;
            }
            set
            {
                rChild = value;
            }
        }
 
    }
}

接着来看二叉树的定义和基本运算的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinkBiTree
{
    public class LinkBiTree<T> where T : IComparable<T>
    {
        //头引用字段
        private BiTreeNode<T> head;
        //头引用属性
        public BiTreeNode<T> Head
        {
            get
            {
                return head;
            }
            set
            {
                head = value;
            }
        }

        //构造函数
        //不含参数的构造函数
        public LinkBiTree()
        {
            head = null;
        }
        //含一个参数的构造函数
        public LinkBiTree(T val)
        {
            BiTreeNode<T> p = new BiTreeNode<T>(val);
            head = p;
        }
        //含三参数的构造函数
        public LinkBiTree(T val, BiTreeNode<T> lc, BiTreeNode<T> rc)
        {
            BiTreeNode<T> p = new BiTreeNode<T>(val, lc, rc);
            head = p;
        }

        // 二叉树判空
        public bool IsEmpty()
        {
            if (head == null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        //获取根节点
        public BiTreeNode<T> Root()
        {
            return head;
        }

        //获取节点的左孩子
        public BiTreeNode<T> GetLChild(BiTreeNode<T> p)
        {
            return p.LChild;
        }

        //获取节点的右孩子
        public BiTreeNode<T> GetRChild(BiTreeNode<T> p)
        {
            return p.RChild;
        }


        //将节点p的左子树插入值为val的新节点,原来的左子树成为新节点的左子树
        public void InsertLChlid(T val, BiTreeNode<T> p)
        {
            BiTreeNode<T> temp = new BiTreeNode<T>(val);
            temp.LChild = p.LChild;
            p.LChild = temp;
        }


        //排序插入函数
        public void SortInsert(T newItem,BiTreeNode<T> p)
        {
            if (p.Data.CompareTo(newItem)>0)
            {
                if (p.LChild == null)
                {
                    p.LChild = new BiTreeNode<T>(newItem);
                }
                else
                {
                    SortInsert(newItem, p.LChild);
                }
            }
            else
            {
                if (p.RChild == null)
                {
                    p.RChild = new BiTreeNode<T>(newItem);
                }
                else
                {
                    SortInsert(newItem, p.RChild);
                }
            }

        }

        //将节点p的右子树插入值为val的新节点,原来的右子树成为新节点的右子树

        public void InsertRChild(T val, BiTreeNode<T> p)
        {
            BiTreeNode<T> temp = new BiTreeNode<T>(val);
            temp.RChild = p.RChild;
            p.RChild = temp;
        }

        //若p非空 删除节点p的左子树 并将删除的左子树返回
        public BiTreeNode<T> DeleteLChild(BiTreeNode<T> p)
        {
            if ((p == null) || (p.LChild == null))
            {
                return null;
            }

            BiTreeNode<T> temp = p.LChild;
            p.LChild = null;
            return temp;
        }

        //若p非空 删除节点p的右子树 并将删除的右子树返回
        public BiTreeNode<T> DeleteRChild(BiTreeNode<T> p)
        {
            if ((p == null) || (p.RChild== null))
            {
                return null;
            }

            BiTreeNode<T> temp = p.RChild;
            p.RChild = null;
            return temp;
        }

        //在二叉树中查找值为val的节点
        public BiTreeNode<T> Search(BiTreeNode<T> Root, T val)
        {
            BiTreeNode<T> p = Root;

            if (p == null)
            {
                return null;
            }

            if (p.Data.Equals(val))
            {
                return p;
            }
            //递归求左子树
            if (p.LChild != null)
            {
                return Search(p.LChild, val);
            }
            //递归求右子树
            if(p.RChild!=null)
            {
                return Search(p.RChild ,val);
            }

            return null;
        }


        //判断是否为叶子节点
        public bool IsLeaf(BiTreeNode<T> p)
        {
            if ((p != null) && (p.LChild == null) && (p.RChild == null))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

    }
}

 

 

排序二叉树的测试程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LinkBiTree;

namespace SortedBiTreeVisit
{
    class Program
    {
        public static StringBuilder SortedBiTreestr=new StringBuilder();
        //排列二叉树的遍历
      
        public static string SortedBiTreeVisit(BiTreeNode<int> p)
        {
            if (p.LChild != null)
            {
                SortedBiTreeVisit(p.LChild);
            }
            SortedBiTreestr.Append(p.Data.ToString()+" ");
            if (p.RChild != null)
            {
                SortedBiTreeVisit(p.RChild);
            }
            return SortedBiTreestr.ToString();
        }
        static void Main(string[] args)
        {
            LinkBiTree<int> li = new LinkBiTree<int>(1);
            li.SortInsert(23,li.Head);
            li.SortInsert(66, li.Head);
            li.SortInsert(17, li.Head);
            li.SortInsert(12, li.Head);
            li.SortInsert(19, li.Head);
            string result=SortedBiTreeVisit(li.Head);
            Console.WriteLine(result);
            Console.ReadKey();


        }
    }
}

 

二叉树的遍历测试程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LinkBiTree;

namespace BiTreeVisit
{
    class Program
    {
        //用来存储遍历的数据
        public static  StringBuilder PreOderstr = new StringBuilder();
        public static StringBuilder MidOderstr = new StringBuilder();
        public static StringBuilder AftOderstr = new StringBuilder();
        public static StringBuilder LevOderstr = new StringBuilder();
        //保存叶子节点的个数
        public static int leafcount = 0;

        //保存二叉树深度
        左子树
        //public static int LBiTreeHeight = 1;
        右子树
        //public static int RBiTreeHeight = 1;

        //先序遍历递归算法
        public static string PreOrder(BiTreeNode<string> p )
        {
           
            if (p!= null)
            {
                PreOderstr.Append(p.Data+" ");
                PreOrder(p.LChild);
                PreOrder(p.RChild);

            }

            return PreOderstr.ToString();
        }

        //中序遍历递归算法
        public static string MidOrder(BiTreeNode<string> p)
        {

            if (p != null)
            {
                MidOrder(p.LChild);
                MidOderstr.Append(p.Data + " ");
                MidOrder(p.RChild);

            }

            return MidOderstr.ToString();
        }

        //后序遍历递归算法
        public static string AftOrder(BiTreeNode<string> p)
        {

            if (p != null)
            {
                AftOrder(p.LChild);
                AftOrder(p.RChild);
                AftOderstr.Append(p.Data + " ");

            }

            return AftOderstr.ToString();
        }

        //层次遍历
        public static string LevOrder(BiTreeNode<string> p)
        {
            if (p == null)
            {
                return null;
            }

            Queue<BiTreeNode<string>> sq = new Queue<BiTreeNode<string>>();
            sq.Enqueue(p);
            //循环层次遍历
            while (sq.Count > 0)
            {
                //节点出队列
                BiTreeNode<string> temp = sq.Dequeue();
                //将出队列的节点加入到字符串中
                LevOderstr.Append(temp.Data + " ");
                //将出队列的节点的左孩子加入队列
                if (temp.LChild != null)
                {
                    sq.Enqueue(temp.LChild);
                }
                //将出队列的节点的右孩子加入队列
                if (temp.RChild!=null)
                {
                    sq.Enqueue(temp.RChild);
                }
            }
            return LevOderstr.ToString();
        }

 

        //计算二叉树的叶子结点个数
        public static int CalCount(BiTreeNode<string> p)
        {
            if (p == null)
            {
                return 0;
            }

            Queue<BiTreeNode<string>> sq = new Queue<BiTreeNode<string>>();
            sq.Enqueue(p);
            //循环层次遍历
            while (sq.Count > 0)
            {
                //节点出队列
                BiTreeNode<string> temp = sq.Dequeue();
                //将出队列的节点加入到字符串中
                LevOderstr.Append(temp.Data + " ");
                if ((temp.LChild == null) && (temp.RChild == null))
                {
                    leafcount += 1;
                }
                //将出队列的节点的左孩子加入队列
                if (temp.LChild != null)
                {
                    sq.Enqueue(temp.LChild);
                }
                //将出队列的节点的右孩子加入队列
                if (temp.RChild != null)
                {
                    sq.Enqueue(temp.RChild);
                }
            }
            return leafcount;
        }

        //求二叉树深度
        public static int CalBitTreeHeight(BiTreeNode<string> p)
        {
            //定义局部变量保存左子树深度和右子树深度
            int LBiTreeHeight;
            右子树
            int RBiTreeHeight ;
            if (p == null)
            {
                return 0;
            }
            else
            {
                //
                LBiTreeHeight=CalBitTreeHeight(p.LChild);
                //
                RBiTreeHeight = CalBitTreeHeight(p.RChild);
            }

            if (LBiTreeHeight >= RBiTreeHeight)
                return (LBiTreeHeight + 1);
            else
                return (RBiTreeHeight + 1);
        }


        //测试函数
        static void Main(string[] args)
        {
            //初始化二叉树
            LinkBiTree<string> p = new LinkBiTree<string>("A");
            //建立二叉树
            BiTreeNode<string> temp = p.Head;
            temp.LChild = new BiTreeNode<string>("B");
            temp.RChild = new BiTreeNode<string>("C");
            temp.LChild.LChild = new BiTreeNode<string>("D");
            temp.LChild.RChild = null;
            temp.RChild.LChild = new BiTreeNode<string>("E");
            temp.RChild.RChild = new BiTreeNode<string>("F");
            temp.LChild.LChild.LChild = null;
            temp.LChild.LChild.RChild = new BiTreeNode<string>("G");

 

            //显示初始化的二叉树
            Console.WriteLine("初始化的二叉树为:");
            Console.WriteLine();
            Console.WriteLine(" " + " " + " " + " " + "A");
            Console.WriteLine(" " + " " + " " + " " + "*");
            Console.WriteLine(" " + " " + " " + "*" + " " + "*");
            Console.WriteLine(" " + " " + "*" + " " + " " + " " + "*");
            Console.WriteLine(" " + " " + "B" + " " + " " + " " + "C");
            Console.WriteLine(" " + " " + "*" + " " + " " + " " + "*");
            Console.WriteLine(" " + "*" + " " + " " + " " + "* " + " " + "*");
            Console.WriteLine("*" + " " + " " + " " + "*" + " " + " " + " " + " " + "*");
            Console.WriteLine("D" + " " + " " + " " + "E" + " " + " " + " "+ " " +"F");
            Console.WriteLine("*");
            Console.WriteLine(" " + "*");
            Console.WriteLine(" " + " "+"*");
            Console.WriteLine(" " + " " +  "G");
            Console.WriteLine("-------------------------------------------------------------------");


            Console.WriteLine("先序遍历的结果为:");
            string prestring = Program.PreOrder(p.Head);
            Console.WriteLine(prestring);

            Console.WriteLine("-------------------------------------------------------------------");


            Console.WriteLine("中序遍历的结果为:");
            prestring = Program.MidOrder(p.Head);
            Console.WriteLine(prestring);


            Console.WriteLine("-------------------------------------------------------------------");


            Console.WriteLine("后序遍历的结果为:");
            prestring = Program.AftOrder(p.Head);
            Console.WriteLine(prestring);
           


            Console.WriteLine("-------------------------------------------------------------------");


            Console.WriteLine("层次遍历的结果为:");
            prestring = Program.LevOrder(p.Head);
            Console.WriteLine(prestring);
        


            Console.WriteLine("-------------------------------------------------------------------");


            Console.WriteLine("叶子节点的个数为:");
            int conut =Program.CalCount(p.Head);
            Console.WriteLine(conut.ToString());


            Console.WriteLine("-------------------------------------------------------------------");


            Console.WriteLine("二叉树的深度为:");
            conut = Program.CalBitTreeHeight(p.Head);
            Console.WriteLine(conut.ToString());
         

 

 

            Console.ReadKey();
        }
    }
}

 

首次写博客 就写这么多吧 也算是留个脚印 ^_^

转载于:https://www.cnblogs.com/liuling2010/archive/2010/12/05/cocoliu.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值