501. 二叉搜索树中的众数
题目描述
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
题解思路
- 迭代法
- 中序遍历二叉树,将节点放入一个
vector
数组中,三个for
循环来处理该vector
- 第一个
for
循环将vector放进map中
map<int, int> m; for(int i = 0; i < v.size(); i++){ m[v[i]]++; }
- 第二个
for
循环找到频率最大的key
int max = INT_MIN; for(map<int, int>::iterator it = m.begin(); it != m.end(); it++){ max = max < it->second ? it->second : max; }
- 第三个
for
循环根据最大频率值找到与之匹配的key
并且放入结果vector
vector<int> result; for(map<int, int>::iterator it = m.begin(); it != m.end(); it++) if(it->second == max) result.push_back(it->first);
- 完整代码
class Solution { public: vector<int> findMode(TreeNode* root) { stack<TreeNode*> s; vector<int> v; int diff = 1000000; s.push(root); while(!s.empty()){ TreeNode* cur = s.top(); s.pop(); if(cur){ if(cur->right) s.push(cur->right); s.push(cur); s.push(nullptr); if(cur->left) s.push(cur->left); }else{ cur = s.top(); s.pop(); v.push_back(cur->val); } } map<int, int> m; for(int i = 0; i < v.size(); i++){ m[v[i]]++; } int max = INT_MIN; for(map<int, int>::iterator it = m.begin(); it != m.end(); it++){ max = max < it->second ? it->second : max; } vector<int> result; for(map<int, int>::iterator it = m.begin(); it != m.end(); it++) if(it->second == max) result.push_back(it->first); return result; } };
- 迭代
- 中序遍历大框架来进行操作
void inorder(TreeNode* root){ if(!root) return; inorder(root->left); // 处理逻辑 inorder(root->right); }
- 由于二叉搜索树的中序遍历是升序的,所以可以用记录前一个节点的方法来处理众数,设置一个窗口变量,某数的频率有多高这个窗口变量就有多大,然后设置一个最大窗口变量来代表结果,下列是其具体处理逻辑
if(postnode){ if(postnode->val == root->val) chuangkou++; else chuangkou = 1; }else{ chuangkou = 1; } postnode = root; if(chuangkou == maxchuangkou){ result.push_back(root->val); } if(chuangkou > maxchuangkou){ maxchuangkou = chuangkou; result.clear(); result.push_back(root->val); }
- 完整代码
class Solution { public: int chuangkou; int maxchuangkou; vector<int> result; TreeNode *postnode; void inorder(TreeNode* root){ if(!root) return; inorder(root->left); if(postnode){ if(postnode->val == root->val) chuangkou++; else chuangkou = 1; }else{ chuangkou = 1; } postnode = root; if(chuangkou == maxchuangkou){ result.push_back(root->val); } if(chuangkou > maxchuangkou){ maxchuangkou = chuangkou; result.clear(); result.push_back(root->val); } inorder(root->right); } vector<int> findMode(TreeNode* root) { inorder(root); return result; } };