一道多树递归面试题

第一次正式现场面试,感慨颇深,面试的是软件开发,因为该职位的方向跟自己以后想从事的方向差别很大,所有最后没能应聘成功,但是也算是个良好的开始,也想给自己接下来面试的过程做一个记录,鼓励也好,记忆也罢,总之我来过。。。

根据自己的记忆先复原一下这道笔试题。

一个部门的雇员有:有部门经理(MD),产品经理(PM),销售人员,PM的直接上级是MD,销售人员的直接上级是PM,要求写一个函数,传入的参数是一个人雇员,最后的输出是该雇员以及其所以下属雇员的工资总和。 

                                                      

比如:输入A,输出是:10000+6000+5000+4000+3500+3000+2500+2000+1500+1000

         输入B输出是:6000+3500+3000

         输入E,输出是:3500

先讲一下当时的心路历程。。。

首先,一直没明白superior是什么意思(都是英文,⊙﹏⊙b汗),所以根本没有这一项,所以导致思路也错了,结果,如果输入B时,输出是所以salar的和与B相加,思路整错了。。

后来不好意思的问了下面试官superior是啥子意思,被提醒了下应该要约递归,当时有点蒙。。主要是对递归还不是很熟悉。。。

画个树一切就明了了。。

                                                           

二叉树里用的递归最多,是因为各个层次之间是有联系的,这棵树虽然不是二叉树,但也可以利用递归做出来。

但是这道题难点是:1、怎样定义树结点的结构

         2、怎样构造出这样的树

                             3、要求输入是雇员,那么怎样通过输入,查找树中相对应的结点(树的查找)

                             4、查找到相应的节点后,如何计算出结果

思路:假设上表中员工信息已经都读入到一个vector<struct Employee> &employees中

树结点的结构

1 struct TreeNode 
2 {
3     string name;  //雇员的名字
4     int salary;
5     vector<TreeNode*> childs;   //结点的各种孩子指针
6     TreeNode * parent;     //结点的双亲指针
7 };

构造树

 1 TreeNode* construct_tree(vector<struct Employee> &employees) {
 2     TreeNode *employeesArray = (TreeNode*)malloc(sizeof(TreeNode));
 3     for(int i = employees.size() - 1; i >= 0; i--)   //从最后一个结点开始构造
 4     {
 5         employeesArray[i].name = employees[i].name;
 6         employeesArray[i].salary = employees[i].salary;
 7         if(employees[i].higher_commander_id)       //判断父结点是否已经创建
 8         {
 9             int parent_id = employees[i].higher_commander_id;
10             employeesArray[i].parent = &employeesArray[parent_id];
11             employeesArray[parent_id].childs.push_back(&employeesArray[i]);
12         }
13     }
14     return employeesArray;
15 }

通过输入的雇员,查找树中相对应的结点

1 TreeNode* find_node_by_name(TreeNode *pNode, string &name)
2 {
3     if(pNode->name == name) return pNode;
4     for(int i = 0; i < pNode->childs.size(); i++) {
5         if(pNode = find_node_by_name(pNode->childs[i], name))   //利用孩子指针递归查找
6             return pNode;
7     }
8     return NULL;
9 }

递归求解结果

1 int traverse_tree(Node *pNode) {
2     printf("%d", pNode->salary);
3     for(int i = 0; i < pNode->childs.size(); i++) {
4         printf(" + ");
5         traverse_tree(pNode->childs[i]);
6     }
7     return -1;
8 }
原文地址:https://www.cnblogs.com/tracyhan/p/5531495.html