计算一棵树的深度和宽度[Treeview的深度和宽度](多题头的表格问题解决的基础)...
用.net怎么来作呢?
这个题目的提出是由于要设计一个多题头的表格而抽象出来的。
动态生成一个多题头的表格如下:
![](/assets/blank.gif)
由如下xml描述
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
完成动态的创建多题头的表格的难点在于,
一棵树的深度和宽读,一个叶枝的级别以及这个叶枝有多少个子叶枝(宽度).
=============================================================
现在我完成一些基本的东西。
先计算一个树的宽度[由此可得到一个节点的宽度的算法]
定义初始宽度
![](/Images/OutliningIndicators/None.gif)
利用递归算法来遍历父节点下面的所有的节点,发现是叶子的则加一
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
计算树的深度算法我开始想了一个,结果发现有一点问题:
还是先定义初始变量,一个为最大的值,一个为目前的深度值
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
第一个算法:
基本想法是,遍历所有的节点,如果节点还有子节点则加1,
否则目前深度值置为零。
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这个算法对单根线的计算是没有问题的,
但是对于多个子节点的计算是有问题的:
看看图
为了降低解释问题的负责度,我只取这个图树的一个节点来分析。
假如我们的这个树是上图节点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
现在把算法二改进版
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这个算法的想法是确定每个节点的级别,最顶上的是一,
节点向下遍历的时候,子节点的级别为parent level+1,
最大的付给_max,这样就可以得到树的深度了。
计算一棵树的深度和宽度[Treeview的深度和宽度](多题头的表格问题解决的基础)...相关推荐
- 基于深度逐点方向嵌入的城市移动激光扫描点云单棵树提取
Paper题目:Individual tree extraction from urban mobile laser scanning point clouds using deep pointwis ...
- 用 vue + d3 画一棵树
结果预览 github pages vue 和 d3 的角色 画图可分为两步: 元素坐标计算 数据绑定 坐标计算只需要一些 api,本文使用 d3. 数据绑定既可以借助 d3,也可以使用 vue.d3 ...
- 找出一棵树某一深度所有节点
方法一: 思路: 运用左右子树依次递归,根据深度值 k 每次递归k值减去 1 .直到 k 值为1时把此节点加入到结果队列,最后返回结果输出. 伪代码: main(){ 创建一棵测试树: 创建一个结果队 ...
- 【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 ...
- 树(2)-----leetcode(层、深度、节点)
1.树的类实现: class TreeNode(object):def __init__(self, x):self.val = xself.left = Noneself.right = None ...
- 如何遍历一棵树(基于Python的理解以及实现)
文章目录 如何遍历一棵树 1.宽度优先搜索(BFS)/广度优先遍历 2.深度优先搜索(DFS) (1)前序遍历序列:[**根节点**,左子树,右子树] (2)中序遍历序列:[左子树,**根节点**,右 ...
- c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树
1.树:n个结点的有限集,n=0时为空树. 1)特点: (1)有且仅有一个特定的称为根的结点. (2)有若干个互不相交的子树,这些子树本身也是一棵树. (3)树的根结点没有前驱结点,除根结点外的所有结 ...
- 一棵树,怎么就平衡了(图解AVL+实现)
什么是AVL树 大家好,我是bigsai,好久不见,甚是想念. 对于树这种数据结构,想必大家也已经不再陌生,我们简单回顾一下. 在树的种类中,通常分成二叉树和多叉树,我们熟悉的二叉树种类有二叉搜索(排 ...
- xgboost 一般多少棵树_大白话人工智能算法-第32节集成学习之通俗理解XGBoost原理和过程...
本节讲解XGBoost的原理~ 目录 1.回顾: 1.1 有监督学习中的相关概念 1.2 回归树概念 1.3 树的优点 2.怎么训练模型: 2.1 案例引入 2.2 XGBoost目标函数求解 3.X ...
最新文章
- javascript pattern
- 微型计算机分析,微机原理练习题分析
- codevs 2924 数独挑战
- 代码生成工具之界面快速生成
- 7.18 collection random os sys等模块
- 从Nacos客户端视角来分析一下配置中心实现原理
- 中国 AI 的“黄埔军校”?MSRA 被曝停招“国防七子”及北邮学生
- 抓虫系列(三) 不要轻视web程序中常用的三个池 之数据库连接池
- linux 编写java代码
- 22. jQuery 遍历 - 同胞
- PreferenceScreen使用
- 系统分析与设计课程项目总结
- ACM题库(计蒜客A1001整除问题)
- FastDFS原理概括
- 光驱放入空盘,出现无法访问函数不正确(收藏)
- 使用idea连接阿里云RDS数据库
- “云上贵州”成全国首个国密算法应用试点项目 阿里政务云实现“国家级”安全保护...
- 从视频中提取图片(截取ppt)
- GO 中 Chan 实现原理分享
- 逆向直播盒子Green-iOS客户端
热门文章
- 嵌入式:中断的分类和区别
- ubuntu 分区_系统小技巧:迁移通过Wubi方式安装的Ubuntu系统
- if分支语句(JS)
- 模型相关:SolidWorks按实际比例创建模型,在Unity中保持尺寸不变
- java 类库_Java基础类库
- springboot testcontext @sql_SpringBoot图文教程11—从此不写mapper文件「集成MybatisPlus」...
- Halcon图像预处理与形态学(图像的点运算)
- nginx访问控制allow、deny(ngx_http_access_module)
- Android一种常见的布局困扰
- xshell 登录kail拒绝了密码 已解决