我们知道,树类型作为数据结构中的重要一员,树的很多实现都是来自递归。本文想要实现的就是在桌面客户端项目开发中,经常用到的树结构(.Net平台下有个控件为TreeView)。事实上,我们可能因业务需求自行定义一个树类型的数据结构。

接下来,首先给出我一开始用来获取树的深度的算法实现(存在欠缺)

private int GetExportReportTemplateColumns(ReportTemplateTreeDTO reportTemplateTree, int reportTemplateTreeDepth, int treeDepthMark)
        {
            var reportTemplate = reportTemplateTree.ReportTemplate;
            int childrenCount = reportTemplateTree.Children.Count();
            if (childrenCount > 0)
            {
                ++reportTemplateTreeDepth;
                for (int j = 0; j < childrenCount; j++)
                {
                    GetExportReportTemplateColumns(reportTemplateTree.Children[j], reportTemplateTreeDepth, treeDepthMark);
                }
            }
            else
            {
                if (+treeDepthMark < reportTemplateTreeDepth) treeDepthMark = reportTemplateTreeDepth;
            }
            return treeDepthMark == 0 ? reportTemplateTreeDepth + 2 : treeDepthMark + 2;
        }

上面这个算法,获取的是实时的树下的子节点高度,最终无法实现返回子树的最大高度值作为该树的高度。

后经查阅资料,改进如下:

private int GetExportReportTemplateTreeDepth(ReportTemplateTreeDTO reportTemplateTree)
        {
            int reportTemplateTreeDepth = 0;
            if (reportTemplateTree.Children.Count == 0)
                return 1;
            else
            {
                foreach (var reportTemplate in reportTemplateTree.Children)
                {
                    int subReportTemplateTreeDepth = GetExportReportTemplateTreeDepth(reportTemplate);
                    if (subReportTemplateTreeDepth > reportTemplateTreeDepth) reportTemplateTreeDepth = subReportTemplateTreeDepth;
                }
                return reportTemplateTreeDepth + 1;
            }
        }

这里要提醒一下,计算树的高度之类的算法实现,需要首先弄清楚高度的概念:从根结点开始算起。

C#算法实现获取树的高度的更多相关文章

  1. 数据结构与算法:AVL树

    AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.AV ...

  2. [算法]从Trie树(字典树)谈到后缀树

    我是好文章的搬运工,原文来自博客园,博主July_,地址:http://www.cnblogs.com/v-July-v/archive/2011/10/22/2316412.html 从Trie树( ...

  3. 如何知道btree树的高度

    来自网络,总结到这里: 当我想看btree树高度的时候,筛选出来这篇文章"为什么 B-tree 在不同著作中度的定义有一定差别?",知道了高度的算法是这个公式:但是里面又提高t和出 ...

  4. Android进阶笔记18:Android 获取Button的高度、宽度、坐标值

    1. 问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没 ...

  5. 二叉树实例学习(四)——获取节点的高度函数getHight()

    树T中所有节点深度的最大值称为该树的高度(height),实际上每个节点与其所有子节点都可以看做一颗树,也就是说除了根结点,所有子结点都可以看做是一颗子树,因此每个结点都有树高.在本程序中约定,仅含单 ...

  6. iOS之 利用通知(NSNotificationCenter)获取键盘的高度,以及显示和隐藏键盘时修改界面的注意事项

    我们在开发中会遇到这样的情况:调用键盘时需要界面有一个调整,避免键盘遮掩输入框. 但实现时你会发现,在不同的手机上键盘的高度是不同的.这里列举一下: //获取键盘的高度 /* iphone 6: 中文 ...

  7. 动态获取div的高度 随着窗口变化而变化

    // 1.jq法 <script> var winHeight = $(window).height(); $("#show").css("height&qu ...

  8. Android 动态获取ListView的高度

    public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = l ...

  9. jquery获取高度错误(可以获取到宽度,但获取不到高度),及解决办法

    <div class="foo"> <div style="display: none;"> 3333333 </div> ...

随机推荐

  1. 从头认识js-js的发展历史

    JavaScript简介 JavaScript诞生于1995年,当时,它的主要目的是处理以前有服务端语言(如Perl)负责的一些输入验证操作. JavaScript简史 1995年2月当时就职于Net ...

  2. 小程序自定义switch组件

    如上图,小程序api中的switch组件只能自定义颜色,不能自定义宽高,所以就开始了自己写switch组件. 自定义组件样式 switch组件样式大致如图,样式思路:未选中时为一个长方形有圆角按钮,和 ...

  3. iview必备技能一、表单验证规则

    iView表单组件使用async-validator验证器对表单域中数据进行验证,给Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可. 完整的验 ...

  4. Anroid关于fragment控件设置长按事件无法弹出Popupwindows控件问题解决记录

    一.问题描述     记录一下最近在安卓的gragment控件中设置长按事件遇见的一个坑!!!     在正常的activity中整个活动中设置长按事件我通常实例化根部局,例如LinearLayout ...

  5. HDFS文件系统基操--Java实现

    Java实现对HDFS文件系统的基本操作 1.准备好jar包 2.创建一个类 1. 测试连接 @Test //测试是否连接成功 public void test() { //添加配置 ==> c ...

  6. Go组件学习:如何读取ini配置文件

    代码示例全部保存在,欢迎star:https://github.com/EnochZg/golang-examples 安装组件 go get gopkg.in/ini.v1 使用 先创建ini后缀的 ...

  7. 网址封锁的几种方法 公司把 pan.baidu.com 封了 研究实现原理

    HTTP 和 HTTPS 协议HTTP 协议在 头部会发送 host 就是要访问的域名,可以用来被检测. HTTPS 协议虽然会加密全部通讯,但是在握手之前还是明文传输.有证书特证可被检测. 1, D ...

  8. 03、MySql的数据类型

    MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 1.数字类型 类型 大小 范围(有符号) 范围(无符号) ...

  9. python读取文件指定行内容

    python读取文件指定行内容 import linecache text=linecache.getline(r'C:\Users\Administrator\Desktop\SourceCodeo ...

  10. Graylog2进阶 打造基于Nginx日志的Web入侵检测分析系统

    对于大多数互联网公司,基于日志分析的WEB入侵检测分析是不可或缺的. 那么今天我就给大家讲一讲如何用graylog的extractor来实现这一功能. 首先要找一些能够识别的带有攻击行为的关键字作为匹 ...