1700467439
21.1 公司的人事架构是这样的吗
1700467440
1700467441
各位读者,大家在上学的时候应该都学过“数据结构”这门课程吧,还记得其中有一节叫“二叉树”吧,我们上学那会儿这一章节是必考内容,左子树,右子树,什么先序遍历后序遍历,重点就是二叉树的遍历,我还记得当时老师就说,考试的时候一定有二叉树的构建和遍历,现在想起来还是觉得老师是正确的,树状结构在实际中应用非常广泛,想想看你最常使用的XML格式是不是就是一个树形结构。
1700467442
1700467443
咱就先说个最常见的例子,公司的人事管理就是一个典型的树状结构,想想看你公司的组织架构是不是如图21-1所示。
1700467444
1700467445
1700467446
1700467447
1700467448
图21-1 普遍的组织架构
1700467449
1700467450
从最高的老大,往下一层一层的管理,最后到我们这层小兵……很典型的树状结构(说明一下,这不是二叉树,有关二叉树的定义可以翻翻以前的教科书),我们今天的任务就是要把这个树状结构实现出来,并且还要把它遍历一遍,就类似于阅读你公司的人员花名册。
1700467451
1700467452
从该树状结构上分析,有两种不同性质的节点:有分支的节点(如研发部经理)和无分支的节点(如员工A、员工D等),我们增加一点学术术语上去,总经理叫做根节点(是不是想到XML中的那个根节点root,那就对了),类似研发部经理有分支的节点叫做树枝节点,类似员工A的无分支的节点叫做树叶节点,都很形象,三个类型的节点,那是不是定义三个类就可以?好,我们按照这个思路走下去,先看我们自己设计的类图,如图21-2所示。
1700467453
1700467454
1700467455
1700467456
1700467457
图21-2 最容易想到的组织架构类图
1700467458
1700467459
这个类图是初学者最容易想到的类图(首先声明,这个类图是有缺陷的,如果你已经看明白这个类图的缺陷了,该段落就可以一目十行地看下去,我们是循序渐进地讲课,一步一个脚印),非常简单,我们来看一下如何实现,先看最高级别的根节点接口,如代码清单21-1所示。
1700467460
1700467461
代码清单21-1 根节点接口
1700467462
1700467463
public interface IRoot{
1700467464
1700467465
//得到总经理的信息
1700467466
1700467467
public String getInfo();
1700467468
1700467469
//总经理下边要有小兵,那要能增加小兵,比如研发部总经理,这是个树枝节点
1700467470
1700467471
public void add(IBranch branch);
1700467472
1700467473
//那要能增加树叶节点
1700467474
1700467475
public void add(ILeaf leaf);
1700467476
1700467477
//既然能增加,那还要能够遍历,不可能总经理不知道他手下有哪些人
1700467478
1700467479
public ArrayList getSubordinateInfo();
1700467480
1700467481
}
1700467482
1700467483
这个根节点的对象就是我们的总经理,其具体实现如代码清单21-2所示。
1700467484
1700467485
代码清单21-2 根节点的实现
1700467486
1700467487
public class Root implements IRoot{
[
上一页 ]
[ :1.700467438e+09 ]
[
下一页 ]