链接:
链接: 出现次数最多的子树元素和
描述,示例和链接:
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
int maxret = 0;
unordered_map<int,int> mp;
int dfs(TreeNode* root)
{
if(root==nullptr) return 0;
int now = root->val+dfs(root->left)+dfs(root->right);
maxret = max(maxret,++mp[now]);
return now;
}
public:
vector<int> findFrequentTreeSum(TreeNode* root) {
dfs(root);
vector<int> ret;
for(auto &[a,b] : mp)
{
if(b == maxret)
ret.emplace_back(a);
}
return ret;
}
};
代码分析:
1.二叉树的题一般都是 遍历题,要根据题目所求然后寻找最合适的遍历方式
2.每个节点的值是:左子树的值+右子树的值+本身
即:
叶子节点时:0+0+root->val
叶子节点上一层:左节点+右节点+root->val
再上一层:左子树的值+右子树的值+本身
左,右,本身-----后序遍历