利用委托和泛型实现树的常用操作

在日常开发中,经常遇到对树的操作,我们可以利用泛型和委托对这些树进行操作,这样就不需要每有一个树就要实现相应的功能了。

源码在https://files.cnblogs.com/haiconc/LangTest.zip

首先,使用类泛型声明:

 public class TreeOperator<T,K>

在类内声明三个委托

        public delegate K GetTreeKey(T tree);//取得树的Key
        GetTreeKey GTK;

        public delegate K GetParentKey(T tree);//取得树的父节点
        GetParentKey GPK;

        public delegate bool IsKeyEqual(K keyA, K keyB);//比较Key是否相等
        IsKeyEqual IKE;

数据源:

       List<T> source;

构造函数:

 public int MaxDeep = 100;//防止在递归过程中进入无限死循环

 public TreeOperator(GetTreeKey gti, GetParentKey gtp, IsKeyEqual ike , List<T> source, int deep)
        {
            this.GTK = gti;
            this.GPK = gtp;
            this.IKE = ike;
            this.source = source;
            this.MaxDeep = deep;
        }

实现第一个功能


        /// <summary>
        /// 取得从根树到某个树的路径
        /// </summary>
        /// <param name="tree">某个树</param>
        /// <param name="RootTree">根树</param>
        /// <returns></returns>
        public List<T> GetTreePath(T tree, T RootTree)
        {
            List<T> list = new List<T>();
            T temp = tree;

            int i = 0;
            while (!IKE(GTK(temp), GTK(RootTree)))
            {
                list.Add(temp);
                temp = GetParentTreeByTree(temp);
                /* 防止进入死循环 */
                i++;
                while (i > MaxDeep)
                {
                    break;
                }
            }
            list.Add(RootTree);
            list.Reverse();

            return list;
        }

        private T GetTreeByKey(K key)
        {
            foreach (T tee in source)
            {
                if(IKE(GTK(tee),key))
                    return tee;
            }
            return default(T);
        }


        private T GetParentTreeByTree(T tree)
        {
            K key = GPK(tree);

            return GetTreeByKey(key);
        }
第二个功能实现:

   /// <summary>
        /// 取得某个树的所有子孙树
        /// </summary>
        /// <param name="tree"></param>
        /// <param name="source"></param>
        /// <returns></returns>
        public List<T> GetAllSubTree(T tree)
        {
            List<T> list = new List<T>();

            int deep = 0;
            foreach (T tee in source)
            {
                if(IKE(GPK(tee),GTK(tree)))
                {
                    list.Add(tee);
                    AddSub(tee, source, list, deep + 1);
                }
            }

            return list;
        }

        private void AddSub(T tree, List<T> source,List<T> list ,int deep )
        {
            if (deep > MaxDeep) return;
            foreach (T tee in source)
            {
                if (IKE(GPK(tee), GTK(tree)))
                {
                    list.Add(tee);
                    AddSub(tee, source, list, deep + 1);
                }
            }
        }
程序匆忙写成,有待改进。

源码在https://files.cnblogs.com/haiconc/LangTest.zip

原文地址:https://www.cnblogs.com/haiconc/p/2347769.html