目录
- 题目
- 1、不考虑BTS性质,直接寻找众数集合(利用map)
- 2、考虑BTS的中序遍历结果性质
题目
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
1、不考虑BTS性质,直接寻找众数集合(利用map)
这种方法没有考虑性质,同时消耗了额外的空间。
同时要注意,按照value值排序是没有内置函数的,得先将map转换为vector,然后自定义sort的规则,对pair类型数据的第二个值按照从大到小进行排序。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
private:void traversal(TreeNode* cur,unordered_map<int,int>& map){if(cur == NULL ) return ;//以结点值为key,结点值出现的频次为map值map[cur->val]++;traversal(cur->left,map);traversal(cur->right,map);return ;}//定义sort排序的规则,以二维数组的第二维从大到小排序bool static cmp(const pair<int,int>& a,const pair<int,int>& b){if(a.second>b.second) return 1;else return 0;}
public:vector<int> findMode(TreeNode* root) {unordered_map<int,int> map;vector<int> result;if(root == NULL) return result;traversal(root,map);//将map转化为vector(二维数组),以便于下一步的排序vector<pair<int,int>> vec(map.begin(),map.end());sort(vec.begin(),vec.end(),cmp);//vec第一个元素是频次最高的,然后继续寻找与之频次一样的元素for(int i=0;i<vec.size();i++){if(vec[i].second == vec[0].second) result.push_back(vec[i].first);else break;}return result;}
};
2、考虑BTS的中序遍历结果性质
中序遍历的结果是递增的,所以我们只需要比较此结点与上结点是否相等,从而累加频次,然后更新最大频次,更新结果数组,保证众数集合就行了。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
private:int MaxCount;int count;TreeNode* pre = NULL;vector<int> result;void traversal(TreeNode* cur){if(cur == NULL ) return;traversal(cur->left);if(pre == NULL){count = 1;}else if(pre->val == cur->val){count++;}else{count = 1;}pre = cur;//如果出现次数也是最大次数,说明此元素也属于众数集合,应当加入结果集if(count == MaxCount) result.push_back(cur->val);//如果最大次数被更新,那么得清除旧结果if(count > MaxCount){MaxCount = count;result.clear();result.push_back(cur->val);}traversal(cur->right);return ;}
public:vector<int> findMode(TreeNode* root) {MaxCount = 0;count = 0;pre = NULL;result.clear();traversal(root);return result;}
};