当我有一棵树,我想知道它的枝叶最深的级别是多少?它有多少个叶子(最终的节点,我称它为宽度)?
用.net怎么来作呢?
这个题目的提出是由于要设计一个多题头的表格而抽象出来的。
动态生成一个多题头的表格如下:

由如下xml描述

 1    <item HeaderText="Lifecycle Status (Start Date)" >
 2        <item HeaderText="Sample"  TitleCss="trTitle2">
 3            <item HeaderText="α"  ColumnName="sample" TitleCss="trTitle2"   Format="d" />    
 4            <item HeaderText="β"  ColumnName="Sampleb"  TitleCss="trTitle2"  Format="d"  />    
 5            <item HeaderText="ES" ColumnName="SampleES" TitleCss="trTitle2"   Format="d" />    
 6        </item>
 7        <item HeaderText="NPI" ColumnName="NPI" TitleCss="trTitle2"  Format="d" />
 8        <item HeaderText="CEM" ColumnName="CEM" TitleCss="trTitle2"  Format="d" />
 9    
10    </item>
11    <item HeaderText="Under developing and technically immature" >
12        <item HeaderText="Start Date" Width="120" ColumnName="red" TitleCss="trTitle2" Format="d"  />
13        <item HeaderText="Sample Available"  Width="120"  ColumnName="redsample" TitleCss="trTitle2"   Format="d" />    
14    </item>

完成动态的创建多题头的表格的难点在于,
一棵树的深度和宽读,一个叶枝的级别以及这个叶枝有多少个子叶枝(宽度).
=============================================================
现在我完成一些基本的东西。

先计算一个树的宽度[由此可得到一个节点的宽度的算法]
定义初始宽度

private int _treeWidth = 0 ;

利用递归算法来遍历父节点下面的所有的节点,发现是叶子的则加一

计算树的宽度#region 计算树的宽度
        /**//// <summary>
        /// 遍历所有节点。
        /// 发现节点是树叶则加一
        /// 否则,取节点的子节点循环
        /// </summary>
        /// <param name="node"></param>
        private void CountTreeWidth(TreeNode node)
        {
            if(node.Nodes.Count==0)
                this._treeWidth ++;
            else
            {
                for(int i=0;i<node.Nodes.Count;i++)
                {
                    CountTreeWidth(node.Nodes[i]);
                }
            }

        }
        #endregion

计算树的深度算法我开始想了一个,结果发现有一点问题:
还是先定义初始变量,一个为最大的值,一个为目前的深度值

private int _max = 0;
private int _level =0;

第一个算法:
基本想法是,遍历所有的节点,如果节点还有子节点则加1,
否则目前深度值置为零。

    算法一#region 算法一
        private void CountLevel(TreeNode MyNode)
        {
            _level++;
            if(_level>_max)
                _max = _level;
            System.Diagnostics.Debug.WriteLine(MyNode.Text);
            if(MyNode.Nodes.Count!=0)
            {
                
                for(int i=0;i<MyNode.Nodes.Count;i++)
                {
                    System.Diagnostics.Debug.WriteLine(_level);
                    CountLevel(MyNode.Nodes[i]);
                    

                }
            }
            else
            {
                System.Diagnostics.Debug.WriteLine(_level);
            
                    //_level --;
                _level = 0;

            }
            
            

        }
        #endregion

这个算法对单根线的计算是没有问题的,
但是对于多个子节点的计算是有问题的:
看看图

为了降低解释问题的负责度,我只取这个图树的一个节点来分析。
假如我们的这个树是上图节点1开始(包括节点1下面所有子节点)。
我们看算法是怎么算的。。。
算法遍历的过程是

节点1->节点2->节点3->节点13
此时最大深度_max=4
而_level = 0[因为节点13是叶子]
继续。。
这时递归退回到节点2
节点2->节点4
_level = 1
这个时候已经出现问题,
因为节点2的level是3
而计算出来节点4的深度应该是
_level = 3
计算节点4的深度不应该重新计数

如上图如果按照算法,
节点4的
_level = 1
最后算出来的_max = 5
而真实的值应该为6

现在把算法二改进版

算法二改进#region 算法二改进
        /**//// <summary>
        /// 算法还可以改进
        /// 如果知道parent的级别,则本级别则等于parent的level+1
        /// </summary>
        /// <param name="MyNode"></param>
        private void CountLevel3(TreeNode MyNode)
        {
            _level = 1;

            if(MyNode.Parent!=null)
            {
                MyNode.Tag = (int)MyNode.Parent.Tag + 1;
                _level = (int)MyNode.Tag;
            }

            //getMaxDeep(MyNode);
            if(_level>_max)
                _max = _level;
            for(int i=0;i<MyNode.Nodes.Count;i++)
            {
                CountLevel3(MyNode.Nodes[i]);
            }

        }

              
        #endregion

这个算法的想法是确定每个节点的级别,最顶上的是一,
节点向下遍历的时候,子节点的级别为parent level+1,
最大的付给_max,这样就可以得到树的深度了。

计算一棵树的深度和宽度[Treeview的深度和宽度](多题头的表格问题解决的基础)...相关推荐

  1. 基于深度逐点方向嵌入的城市移动激光扫描点云单棵树提取

    Paper题目:Individual tree extraction from urban mobile laser scanning point clouds using deep pointwis ...

  2. 用 vue + d3 画一棵树

    结果预览 github pages vue 和 d3 的角色 画图可分为两步: 元素坐标计算 数据绑定 坐标计算只需要一些 api,本文使用 d3. 数据绑定既可以借助 d3,也可以使用 vue.d3 ...

  3. 找出一棵树某一深度所有节点

    方法一: 思路: 运用左右子树依次递归,根据深度值 k 每次递归k值减去 1 .直到 k 值为1时把此节点加入到结果队列,最后返回结果输出. 伪代码: main(){ 创建一棵测试树: 创建一个结果队 ...

  4. 【VK Cup 2016 - Round 1 (Div 2 Edition)C】【构造】Bear and Forgotten Tree 3 构造一棵树直径为d且点1的深度为h

    Bear and Forgotten Tree 3 time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  5. 树(2)-----leetcode(层、深度、节点)

    1.树的类实现: class TreeNode(object):def __init__(self, x):self.val = xself.left = Noneself.right = None ...

  6. 如何遍历一棵树(基于Python的理解以及实现)

    文章目录 如何遍历一棵树 1.宽度优先搜索(BFS)/广度优先遍历 2.深度优先搜索(DFS) (1)前序遍历序列:[**根节点**,左子树,右子树] (2)中序遍历序列:[左子树,**根节点**,右 ...

  7. c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树

    1.树:n个结点的有限集,n=0时为空树. 1)特点: (1)有且仅有一个特定的称为根的结点. (2)有若干个互不相交的子树,这些子树本身也是一棵树. (3)树的根结点没有前驱结点,除根结点外的所有结 ...

  8. 一棵树,怎么就平衡了(图解AVL+实现)

    什么是AVL树 大家好,我是bigsai,好久不见,甚是想念. 对于树这种数据结构,想必大家也已经不再陌生,我们简单回顾一下. 在树的种类中,通常分成二叉树和多叉树,我们熟悉的二叉树种类有二叉搜索(排 ...

  9. xgboost 一般多少棵树_大白话人工智能算法-第32节集成学习之通俗理解XGBoost原理和过程...

    本节讲解XGBoost的原理~ 目录 1.回顾: 1.1 有监督学习中的相关概念 1.2 回归树概念 1.3 树的优点 2.怎么训练模型: 2.1 案例引入 2.2 XGBoost目标函数求解 3.X ...

最新文章

  1. javascript pattern
  2. 微型计算机分析,微机原理练习题分析
  3. codevs 2924 数独挑战
  4. 代码生成工具之界面快速生成
  5. 7.18 collection random os sys等模块
  6. 从Nacos客户端视角来分析一下配置中心实现原理
  7. 中国 AI 的“黄埔军校”?MSRA 被曝停招“国防七子”及北邮学生
  8. 抓虫系列(三) 不要轻视web程序中常用的三个池 之数据库连接池
  9. linux 编写java代码
  10. 22. jQuery 遍历 - 同胞
  11. PreferenceScreen使用
  12. 系统分析与设计课程项目总结
  13. ACM题库(计蒜客A1001整除问题)
  14. FastDFS原理概括
  15. 光驱放入空盘,出现无法访问函数不正确(收藏)
  16. 使用idea连接阿里云RDS数据库
  17. “云上贵州”成全国首个国密算法应用试点项目 阿里政务云实现“国家级”安全保护...
  18. 从视频中提取图片(截取ppt)
  19. GO 中 Chan 实现原理分享
  20. 逆向直播盒子Green-iOS客户端

热门文章

  1. 嵌入式:中断的分类和区别
  2. ubuntu 分区_系统小技巧:迁移通过Wubi方式安装的Ubuntu系统
  3. if分支语句(JS)
  4. 模型相关:SolidWorks按实际比例创建模型,在Unity中保持尺寸不变
  5. java 类库_Java基础类库
  6. springboot testcontext @sql_SpringBoot图文教程11—从此不写mapper文件「集成MybatisPlus」...
  7. Halcon图像预处理与形态学(图像的点运算)
  8. nginx访问控制allow、deny(ngx_http_access_module)
  9. Android一种常见的布局困扰
  10. xshell 登录kail拒绝了密码 已解决