C++中最频繁的子树和
假设我们有一棵树的根节点,我们需要找到最频繁的子树和。子树和是指以该节点为根的子树中所有节点值的总和(包括该节点本身)。如果有多个子树和的频率相同,则返回所有具有最高频率的值(顺序任意)。例如,如果树是[5,2,-5],则它将返回[2]。这是因为2出现了两次,而-5只出现一次。
为了解决这个问题,我们将遵循以下步骤:
定义两个映射m和freq,m是一个整数键和对应列表的集合,freq将存储每个数字的频率。
定义一个名为solve()的方法,它将接收树节点作为参数。其功能如下:
如果节点为空,则返回0
leftSum := solve(节点的左子节点), rightSum := solve(节点的右子节点)
currSum := 节点值 + leftSum + rightSum
如果频率计数与currSum不同,则
将currSum插入到m[1]处的列表中
设置freq[currSum] := 1
否则
将freq[currSum]加1
将currSum插入到m[freq[currSum]]处的列表中
返回currSum
主方法将如下所示:
如果根节点为空,则返回空集
solve(root)
返回映射m的最后一个列表
让我们看下面的实现来更好地理解:
示例
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; }else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; } else { q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: map <int, vector <int> > m; map <int, int > freq; int solve(TreeNode* node){ if(!node)return 0; int leftSum = solve(node->left); int rightSum = solve(node->right); int currSum = node->val + leftSum + rightSum; //cout << currSum << endl; if(!freq.count(currSum)){ m[1].push_back(currSum); freq[currSum] = 1; //cout << "Adding " << currSum << " 1" << endl; } else { freq[currSum]++; m[freq[currSum]].push_back(currSum); } return currSum; } vector<int> findFrequentTreeSum(TreeNode* root) { m.clear(); freq.clear(); if(!root)return {}; solve(root); return m.rbegin()->second; } }; main(){ vector<int> v = {5,2,-5}; TreeNode *tree = make_tree(v); Solution ob; print_vector(ob.findFrequentTreeSum(tree)); }
输入
[5,2,-5]
输出
[2, ]
广告