二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数
Posted 归宅观察部
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数相关的知识,希望对你有一定的参考价值。
530. 二叉搜索树的最小绝对差
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/
class Solution {
public:
void traversal(TreeNode* cur,vector<int> &vec){
if(cur==NULL){
return;
}
traversal(cur->left,vec);
vec.push_back(cur->val);
traversal(cur->right,vec);
}
int getMinimumDifference(TreeNode* root) {
vector<int> ans;
traversal(root,ans);
int maxDiff=INT_MAX;
for(int i=1;i<ans.size();i++){
maxDiff=min(maxDiff,ans[i]-ans[i-1]);
}
return maxDiff;
}
};
这里使用了先生成数组,然后比较的方法,没有引入pre节点边遍历边比较,在这题中这样的方法应该是更加简单的。
然而看下一道题,不引入pre节点就会麻烦一些。
501. 二叉搜索树中的众数
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当前结点的值 左子树和右子树都是二叉搜索树 例如:给定 BST [1,null,2,2],
1
2
/
2
返回[2].
https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/
思路与上一道题是相似的,先看一下我的错误代码吧,错误太多以至于懒得改了……
class Solution {
public:
void traversal(TreeNode* cur,int& maxCount,int& count,vector<int>& ans){
if(cur==NULL) return;
traversal(cur->left,count,maxCount,ans);
if(ans.empty()) {
ans.push_back(cur->val);
count=1;
}
if(cur->val!=ans.back()){
count=1;
if(count==maxCount){
ans.push_back(cur->val);
}
}
else{
count++;
if(count==maxCount) ans.push_back(cur->val);
if(count>maxCount) {
ans.clear();
ans.push_back(cur->val);
}
maxCount=max(count,maxCount);
}
traversal(cur->right,count,maxCount,ans);
}
vector<int> findMode(TreeNode* root) {
int maxCount=0;
int count=0;
vector<int> ans;
traversal(root,maxCount,count,ans);
return ans;
}
};
class Solution {
private:
int maxCount; // 最大频率
int count; // 统计频率
TreeNode* pre;
vector<int> result;
void searchBST(TreeNode* cur) {
if (cur == NULL) return ;
searchBST(cur->left); // 左
// 中
if (pre == NULL) { // 第一个节点
count = 1;
} else if (pre->val == cur->val) { // 与前一个节点数值相同
count++;
} else { // 与前一个节点数值不同
count = 1;
}
pre = cur; // 更新上一个节点
if (count == maxCount) { // 如果和最大值相同,放进result中
result.push_back(cur->val);
}
if (count > maxCount) { // 如果计数大于最大值频率
maxCount = count; // 更新最大频率
result.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
result.push_back(cur->val);
}
searchBST(cur->right); // 右
return ;
}
public:
vector<int> findMode(TreeNode* root) {
count = 0;
maxCount = 0;
TreeNode* pre = NULL; // 记录前一个节点
result.clear();
searchBST(root);
return result;
}
};
//代码来自公众号代码随想录 作者为Carl
以上是关于二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数的主要内容,如果未能解决你的问题,请参考以下文章