LeetCode 501 二叉搜索树中的众数

题目: 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:
LeetCode 501 二叉搜索树中的众数_第1张图片

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

思路:

首先将所有的结点值按照键值对的形式存放到unordered_map中,再定义pair类型的vector数组,第一个位置存放键第二个位置存放值,将值按照从大到小的方式排列,最后选出值最大的位置对应的键。

struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x) :val(x), left(NULL), right(NULL){}
};

class Solution {
public:
	void Treemany(TreeNode* root, unordered_map<int,int>& map) {
		if (root == NULL) return;
		map[root->val]++;
		Treemany(root->left, map);
		Treemany(root->right, map);
	}
};
bool cmp(pair<int,int>&a,pair<int,int>&b) {
	return a.second > b.second;
}
int main() {
	TreeNode* A = new TreeNode(5);
	TreeNode* B = new TreeNode(2);
	TreeNode* C = new TreeNode(6);
	TreeNode* D = new TreeNode(2);
	TreeNode* E = new TreeNode(6);
	A->left = B;
	A->right = C;
	B->left = D;
	C->left = E;
	unordered_map<int,int> map;
	Solution ss;
	ss.Treemany(A, map);
	vector<pair<int, int>> vec(map.begin(), map.end());
	sort(vec.begin(), vec.end(), cmp);
	vector<int> result;
	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;
	}
	for (vector<int>::iterator it = result.begin(); it != result.end();it++) {
		cout << *it << " ";
	}
	cout << endl;

	return 0;
}

你可能感兴趣的:(leetcode,算法,数据结构)