• 一道多树递归面试题


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

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

    一个部门的雇员有:有部门经理(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 }
  • 相关阅读:
    GitTortoise + Git Source Control Provider使用笔记
    Manage your ViewEngine(Wirte by myself)
    JSON DATE 转换标准的一些资料(收集)
    IE 6崩溃第一条禁用所有插件
    invalid label problem
    使用jQuery Html() 作为客户端htmlEncode的问题
    在WIN7下使用XP Mode安装IE6+
    Jquery simple friendly scroll
    Cygwin使用指南
    How to enable Plain Text Password
  • 原文地址:https://www.cnblogs.com/tracyhan/p/5531495.html
Copyright © 2020-2023  润新知