530.二叉搜索树的最小绝对差
题目
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
解题思路
- 因为是二叉搜索树,所以中序遍历的情况下,遍历后的节点的值是单调递增的。
- 因此使用一个vector保存这个树,并计算相邻节点的值的最小值即可
代码
private:
vector<int> result;
public:
int getMinimumDifference(TreeNode* root) {
int minResult = INT_MAX;
getTreeNode(root);
for (int i = 0; i < result.size() - 1; ++i) {
minResult = min(minResult, result[i + 1] - result[i]);
}
return minResult;
}
void getTreeNode(TreeNode *node) {
if (node == nullptr) return;
getTreeNode(node->left);
result.push_back(node->val);
getTreeNode(node->right);
}
501.二叉搜索树中的众数
题目
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
解题思路
- 遍历二叉树
- 用map记录每个节点出现的次数
代码
class Solution {
private:
void searchBST(TreeNode* cur, unordered_map<int, int>& map) { // 前序遍历
if (cur == NULL) return ;
map[cur->val]++; // 统计元素频率
searchBST(cur->left, map);
searchBST(cur->right, map);
return ;
}
bool static cmp (const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
public:
vector<int> findMode(TreeNode* root) {
unordered_map<int, int> map; // key:元素,value:出现频率
vector<int> result;
if (root == NULL) return result;
searchBST(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++) {
// 取最高的放到result数组中
if (vec[i].second == vec[0].second) result.push_back(vec[i].first);
else break;
}
return result;
}
};