给你一个含重复值的二叉搜索树(BST),找出并返回 BST 中的所有众数(即,出现频率最高的元素)。
方法1:
常规方法,不论是不是二叉搜索树,遍历树的每个节点,将其值以及频率保存在一个map中,对map进行排序返回出现频率最高的一个或几个数值。
实现代码如下:
//递归法 遍历二叉树,使用map进行统计
void traversal(TreeNode* node, unordered_map <int, int>& map) {
if(node == NULL) return;
if(node->left) traversal(node->left, map);
map[node->val]++;
if(node->right) traversal(node->right, map);
return;
}
bool static cmp(const pair<int, int> &a, const pair<int,int> &b) {
return a.second > b.second;
}
vector<int> findMode(TreeNode* root) {
unordered_map <int, int> map;
vector<int> result;
if(root == NULL) return result;
traversal(root, map);
vector<pair<int,int>> vec(map.begin(), map.end());
sort(vec.begin(), vec.end(), cmp);
result.push_back(vec[0].first);
for(int i = 1; i<vec.size(); i++) {
if (vec[i].second == vec[0].second) result.push_back(vec[i].first);
else break;
}
return result;
}
方法2:
因为是二叉搜索树,所以他的中序遍历是有序的,只需要比较相邻两个元素做比较,输出出现最高频率的元素即可。
弄一个指针指向前一个节点,使当前节点与前一个节点作比较。
如果频率等于最大频率就加入结果集中,当频率大于最大频率时,就要清空结果集,重新加入元素,实现代码如下:
//迭代法 中序遍历
vector<int> findMode(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = NULL;
int maxCount = 0;
int count = 0;
vector<int> result;
while(cur!=NULL || !st.empty()) {
if(cur != NULL) {
st.push(cur);
cur = cur->left;
}
else {
cur = st.top();
st.pop();
if(pre == NULL) {
count = 1;
}
else if(pre->val == cur->val) {
count++;
}
else{
count = 1;
}
if(count == maxCount) {
result.push_back(cur->val);
}
if(count > maxCount) {
maxCount = count;
result.clear();
result.push_back(cur->val);
}
pre = cur;
cur = cur->right;
}
}
return result;
}