一道多树递归面试题
第一次正式现场面试,感慨颇深,面试的是软件开发,因为该职位的方向跟自己以后想从事的方向差别很大,所有最后没能应聘成功,但是也算是个良好的开始,也想给自己接下来面试的过程做一个记录,鼓励也好,记忆也罢,总之我来过。。。
根据自己的记忆先复原一下这道笔试题。
一个部门的雇员有:有部门经理(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 }