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

源码在http://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);
                }
            }
        }
程序匆忙写成,有待改进。

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

转载于:https://www.cnblogs.com/haiconc/archive/2012/02/12/2347769.html

利用委托和泛型实现树的常用操作相关推荐

  1. JavaScript实现树以及对树的常用操作

    JS实现树 JavaScript没有树这种结构,使用object以及array实现. const tree = {value:'a',children: [{value'b',children:[]} ...

  2. 利用委托机制处理.NET中的异常

    利用委托机制处理.NET中的异常<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&quo ...

  3. 【Groovy】编译时元编程 ( 利用注解进行 AST 语法树转换 | 定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )

    文章目录 一.利用注解进行 AST 语法树转换 1.定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 2.AST 转换接口实现 3.定义 Groovy ...

  4. Python:pmml格式文件的简介、安装、使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略

    Python:pmml格式文件的简介.安装.使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略 目录 pmml格式文件的简介 1.PMML结构 pmml安装 pmm ...

  5. C# 委托 (一)—— 委托、 泛型委托与Lambda表达式

    C# 委托 (一)-- 委托. 泛型委托与Lambda表达式 2018年08月19日 20:46:47 wnvalentin 阅读数 2992 版权声明:此文乃博主之原创.鄙人才疏,望大侠斧正.此文可 ...

  6. 利用委托 实现窗体间通信,非原创

    copy自:https://www.cnblogs.com/hugoNB/p/7130562.html,这个作者写的浅显易懂,就复制下来自己看 实现过程: 这里主要是用到委托实现,所以主要描述一下委托 ...

  7. C#利用委托实现窗体间的值传递

    C#利用委托实现窗体间的值传递 A.网上有很多方法,大家可搜一下,都可用. B.这里只是说明下是只利用委托,学习基本的委托运用. 方法如下: 1.C#建立一个默认工程,默认窗体Form1 2.加入一个 ...

  8. 4.9 利用对应的泛型替换Hashtable[转]

      摘要:<C#3.0cookbook中文版><C#3.0cookbook中文版>本书侧重于解决C#程序员在开发应用程序时遇到的各类问题,并以此组织全书内容.这些解决方案称为秘 ...

  9. .NET利用委托实现动态查询

    今天在整理代码的时候发现这个.通过灵活利用委托实现动态(条件)查询. 直接上代码: int articleId = 119; var firstArticle = new ArticleDac().G ...

最新文章

  1. 语音合成(文字转语音)工具大全
  2. CTO:再写if-else,逮着一个罚款1000!
  3. 自学机器学习、深度学习、人工智能的学习资源集合
  4. android屏幕适配的五种方式_讲一讲Android 9.0系统的新特性,对刘海屏设备进行适配...
  5. 收不回来的value
  6. c#多维数组的建立及操作 总结
  7. selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’解决
  8. 内存条上面参数详解_为什么买内存条要看时序?别以为内存频率高性能就好
  9. Inception网络 运行在Cifar10 测试集87.88% Tensorflow 2.1 小白从代码实践中 理解
  10. JSK-129 判断日期是否符合格式【入门】
  11. Julia: ...的作用,有意思!
  12. 最好用的屏幕录像软件,三步实现高清录制?
  13. golang学习之五:error、painc、recover
  14. 神武授权位置服务器,太古封魔录神武获得,神武服务器入口
  15. [生存志] 第74节 孔子集结诗经
  16. [转] 心态是最大的本钱;人无完人,重要的是怎么做人
  17. [学习标准库]stdio.h
  18. 研读Joint Multi-modal Aspect-Sentiment Analysis with Auxiliary Cross-modal
  19. 武汉计算机考研好的学校排名,武汉排名前十的考研学校
  20. pycharm PEP8 资料

热门文章

  1. java action dao_java中Action层、Service层和Dao层的功能区分
  2. 中信银行总行信息科技部笔试面试以及最后拿offer经历
  3. 软件工程——视频总结
  4. 从底层吃透java内存模型(JMM)、volatile、CAS
  5. 自动驾驶汽车事故的罪责追究
  6. Java的File类
  7. Docker核心技术之数据管理
  8. python 删除字符串中重复的元素
  9. Java 构造方法与成员方法的区别
  10. gvim plugin管理