1 题目描述
题目链接:开幕式火焰
2 解答思路
递归分为三步,接下来就按照这三步来思考问题
第一步:挖掘出相同的子问题 (关系到具体函数头的设计)
第二步:只关心具体子问题做了什么 (关系到具体函数体怎么写,是一个宏观的过程)
第三步:找到递归的出口,防止死递归 (关系到如何跳出递归)
2.1 相同的子问题(函数头设计)
子问题:找一颗二叉树有多少不同的火焰,就是找这颗二叉树的左子树有多少不同的火焰和右子树有多少不同的火焰。
下面是leetcode给的函数头:
int numColor(TreeNode* root) {
}
参数传递的是一颗二叉树。题目中提到“不同的颜色”
这里要强调不同的
,我们就可以使用一种数据结构哈希表
来存储。
因此我们不能用leetcode给的函数头,要自己设计一个,参数传递是TreeNode*
和 unordered_set< int >
。
该使用什么返回值?我们直接使用了 unordered_set< int >
来存储火焰,最后只需要返回 unordered_set< int >
的size
就行了,因此,返回值为void
。
最终,函数头设计如下:
void addColors(TreeNode* root, unordered_set<int>& colors)
{
}
2.2 具体的子问题做了什么(函数体的实现)
具体子问题的思路就是:判断当前节点是不是不重复的,如果是就加入到 unordered_set< int >
中,否则就去左子树中找和右子树中找。
递归的出口:当前节点为空。
void addColors(TreeNode* root, unordered_set<int>& colors)
{
//递归的出口
if (root == nullptr)
return;
//将当前值放入到哈希中,如果没有相同的,该值才会进入到哈希中
colors.insert(root->val);
//去左子树中寻找
addColors(root->left, colors);
//去右子树中寻找
addColors(root->right, colors);
}
3 总结
class Solution {
public:
int numColor(TreeNode* root) {
unordered_set<int> colors;
addColors(root, colors);
return colors.size();
}
void addColors(TreeNode* root, unordered_set<int>& colors)
{
//递归的出口
if (root == nullptr)
return;
//将当前值放入到哈希中,如果没有相同的,该值才会进入到哈希中
colors.insert(root->val);
//去左子树中寻找
addColors(root->left, colors);
//去右子树中寻找
addColors(root->right, colors);
}
};
1. 相同的子问题:找一颗二叉树有多少不同的火焰,就是找这颗二叉树的左子树有多少不同的火焰和右子树有多少不同的火焰。
2. 具体子问题做了什么:判断当前节点是不是不重复的,如果是就加入到unordered_set< int >中,否则就去左子树中找和右子树中找。
3. 递归的出口:当前节点为空