题解 | #Department list to tree#

Department list to tree

http://www.nowcoder.com/questionTerminal/86dc86da50424b47b25ced3e9f97b056

列表每一个条目第一个字符串是当前部门id,第二个字符串是父节点(父部门)id,第三个字符串是部门名称。
主要思想:
1.建立父节点id到其所有子节点的映射(子节点集合set有序,而且是字典序。
2.建立部门名称到部门id的映射。
3.找到根节点。
4.从根节点递归先序遍历。

class Solution {
    unordered_map<string, set<string>>ump;//无序map 有序set, 每个id的子节点 set
    unordered_map<string, string> umps;//部门名字 id 映射
public:
    vector<string> listToTree(string** departments, int departmentsRowLen, int* departmentsColLen) {
        string root;//根节点
        for(int i=0;i<departmentsRowLen;i++){ 
            umps[departments[i][2]]=departments[i][0];//建立部门名字到部门id的映射"                     
            if(departments[i][1]==""){//root节点没有父节点  
                root=departments[i][2];//根节点名字
            }else ump[departments[i][1]].insert(departments[i][2]);// key:父节点id。value:孩子节点 部门名字set 
        } 
         vector<string> res;//结果
         preOrder(root,res);//先序遍历root
         return res;
    }
    void preOrder(string& root, vector<string>& res){
        res.push_back(root);//先添加当前节点
        set<string> children=ump[umps[root]];//根据id获取当前节点所有子节点,set已按字典有序
        for(auto child: children) preOrder(child, res);//递归先序遍历每个子节点
    }
};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务