树形结构 撑起软件身躯

数字职场

与编程相关的招聘,都会准备很多考题,应聘者一不小心就在考题上栽了跟斗,特别是没有多少的工作经验的应届毕业生,往往回答得过于理论化,很难令考官满意。为此,我们特意推出本系列,通过对真实的考题的分析帮助大家在回答考题时有更多的实用性,让考官满意,顺利找到工作。

我是恋上Win 7新功能系列的作者魏伟,大家还记得我吗?此前,我给大家讲了Win 7相关的开发,现在我准备讲一道与树形结构有关的面试题,这道题我们公司曾经用过。树形结构是系统开发和软件开发的基础功能之一。

例如D:\游戏\CS,就是一个树形结构,可以说没有树形结构,我们使用的操作系统效率将大大降低。不光是系统,软件开发也是如此,很多大型软件都使用了树形结构。所以掌握好这个功能非常重要,这也是我们在招聘时考查的原因,想从事开发行业的学生朋友一定不要忽视该功能。

题目:编程描述本公司的组织结构,公司名为贯中信息,公司有两个二级部门:决策管理部和集团产品部,集团产品部有两个下级部门:产品一部和产品二部。各部门下有若干员工。

剖析:从题目中可以很容易得出人员的数据结构是{姓名,所属部门},部门的数据结构是{部门名称,上级部门}。要把这两个结构串起来,需要用到树形结构。要构建树形结构,第一件事情就是找到根结点,前面提到,根结点就是没有上级部门的那个部门,其实就是{公司名称,null}。得到根结点后,需要检索并输出这个部门的第二级下属部门和直属人员。接下来是在输出下级部门时,进一步去遍历其下级部门和人员。

实现思路

第一步:找到根结点

Node root;

For(Int i=0;i<部门.Length;i++){

If(部门[i].get(1) ==null){root=部门[i];break;}

第二步:找到直属员工

Void getUsers(String 部门名称){

System.out.println(“***”+部门名称);

For(Int i=0;i<员工.Length;i++){

If(员工[i].get(1) ==部门名称){

System.out.println("*****" +(员工[i].get(0));

第三步:寻找下级部门

Void getDep(String 部门名称){

For(Int i=0;i<部门.Length;i++){

If(部门[i].get(1) ==部门名称){//根据数组中的上级部门字段来判断是不是下级部门

getUsers(部门[i].get(0));//查询并输出该部门的直属员工

getDep(部门[i].get(0));//将部门名称作为参数传给本函数,进一步检索其下级部门和员工

上面的关键代码(完整代码下载地址:http://www.shudoo.com/bzsoft),就将人员和部门的数组转换成了树形的组织结构,不过如果仅仅是这样,主考官只能给你打60分,想拿到更高的分数吗?

算法的优化

如果仅仅做到上面这一步,代码就没有实用价值,很难获得主考官的青睐。那还应该做些什么呢?我的建议是对算法做优化,减少循环次数,让答案具有实用性。

方法1:如果我们已经知道某个部门是否有下级部门,那么可以减少很多循环次数。录入部门数组时,将该部门是否有下级部门的值存入数组中,即部门数组的数据结构改为:

{贯中信息,null,true}

上面的代码中函数getDep的相关代码修改为:

If(部门[i].get(2) ==true){//如果为真,则有下级部门

getDep(部门[i].get(0));

}

方法2:如果我们提前对用户表进行了排序,将同部门的员工排列在一起,那么在检索某个部门的员工时,又可以大大减少循环次数。在上面的代码范例中,将getUser函数的相关代码修改为:

Boolean begin=false;

For(Int i=0;i<员工.Length;i++){

If(员工[i].get(1) ==部门名称){

System.out.println(“*****” +(员工[i].get(0));

begin=true;

}else{

If(begin==true){break;} //在员工的部门名称不等于传入参数时,且已经检索到该部门的员工,那么就认为后面的员工都不属于该部门

方法3:在数据库查询中,遍历组织结构需要用到存储过程,如果可以用一条SQL语句来查询那就非常方便了。先对部门进行编码,每级部门的代码用三位数字表示,例如:001、002。二级部门的代码为 (上级部门的代码)+本级部门代码,例如001002、003001。

我的建议>>

很多学生在应聘的时候,一个不好的习惯就是只考虑是不是能把题目做出来,而忽视了答案的实用性。如果答案具有实用性,考官就会有好感,也会认为你是有经验的人,被录用的可能性也相对较大。例如华为有一道考试题,在20分钟内讲述一个项目的开发,跟我公司的考试题有异曲同工之妙。所以在答题时,一定要对答案进行分析,看其是不是太通用了、太理论了。