LeetCode 1600 皇位继承顺序[多叉树 递归] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1600 皇位继承顺序[多叉树 递归] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
仔细观察该题,其实本质上就是多叉树的深度优先遍历(前序遍历),在树中,优先级为左大于右,左中,上大于下。
如何实现多叉树呢?map是个绝佳的选择,至于死亡数组,用set比较合适(不重复而且无需在乎顺序)。整体步骤如下:
- 定义死亡数组,多叉树map,根;
- 标记国王,并标注为根;
- 插入孩子时,父亲节点队列加入子节点,子节点也开辟新的队列;
- 查询时,首先判断当前节点是否在死亡数组汇总,再递归遍历子节点。
代码如下:
class ThroneInheritance {
private:
// 定义死亡数组,多叉树map,根
set<string> dead;
unordered_map<string, vector<string>> tree;
string root;
public:
ThroneInheritance(string kingName) {
// 标记国王,并标注为根
tree[kingName] = vector<string>();
root = kingName;
}
void birth(string parentName, string childName) {
// 父亲节点队列加入子节点
tree[parentName].push_back(childName);
// 子节点也开辟新的队列
tree[childName] = vector<string>();
}
void death(string name) {
// 死亡就加入死亡数组
dead.insert(name);
}
void getOrder(string root, vector<string>& ans) {
// 如果不在死亡数组,放入查询队列中
if(!dead.count(root)) ans.push_back(root);
// 深度优先遍历
for(string& child : tree[root]) {
getOrder(child, ans);
}
}
vector<string> getInheritanceOrder() {
// 调用gerOrder得到继任序列
vector<string> ans;
getOrder(root, ans);
return ans;
}
};
/**
* Your ThroneInheritance object will be instantiated and called as such:
* ThroneInheritance* obj = new ThroneInheritance(kingName);
* obj->birth(parentName,childName);
* obj->death(name);
* vector<string> param_3 = obj->getInheritanceOrder();
*/
/*作者:heroding
链接:https://leetcode-cn.com/problems/throne-inheritance/solution/cduo-cha-shu-de-shen-du-you-xian-by-hero-ndg4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
以上是关于LeetCode 1600 皇位继承顺序[多叉树 递归] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
[M设计] lc1600. 皇位继承顺序(dfs+哈希表建多叉树+设计+阅读理解)
2021/6/20 刷题笔记皇位继承顺序与多叉树前序遍历,以及python defaultdict