530.二叉搜索树的最小绝对差
看完想法:需要熟悉一下双指针的操作,好久没复习了,优先掌握递归
遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点!
vector<int> sec; //注意是私有全局变量
void puttree(TreeNode* root){
if(root == nullptr) return ;
puttree(root->left);
sec.push_back(root->val);
puttree(root->right);
}
int getMinimumDifference(TreeNode* root) {
sec.clear();
puttree(root);
int minnum = INT_MAX; //求最小值,一开始要设置个最大
for(int i=0; i<sec.size()-1; i++){
minnum = min(minnum,abs(sec[i+1] - sec[i])); //因为是有序数组,不用求abs
}
return minnum;
}
501.二叉搜索树中的众数
看完想法:众数是在一组 数据 中,出现次数最多的数据,是一组数据中的原数据,而不是相应的次数。 一组数据中的众数不止一个,如数据2、3、-1、2、1、3中,2、3都出现了两次,它们都是这组数据中的众数。
这里提高一下难度,分不是二叉搜索树和是二叉搜索树的情况。
如果树是二叉搜索树,就可以只在树上下功夫了,利用中序遍历
void searchBST(TreeNode* root, unordered_map<int, int>& map){
if(root == nullptr) return ;
map[root->val]++;
searchBST(root->left, map);
searchBST(root->right, map);
}
bool static cmp(const pair<int, int>& a, const pair<int, int>& b){
return a.second > b.second;
}
public:
vector<int> findMode(TreeNode* root) {
//由于在private中没有定义全局变量map,所以在public中要定义一次map
vector<int> result;
if(root == nullptr) return result;
unordered_map<int, int> map;
searchBST(root, map);
//用map统计出来了出现频率,但map不能直接对value统计,要转化为vecotr
vector<pair<int, int>> vec(map.begin(), map.end());
sort(vec.begin(), vec.end(), cmp);
for(int i=0; i< vec.size(); i++){
if(vec[i].second == vec[0].second) result.push_back(vec[i].first);
}
return result;
}
236.二叉树的最近公共祖先
看完想法:这里有一个经常弄错的知识点,如何区分遍历一条边还是遍历一整棵树
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root ==q || root ==p || root==NULL) return root; //确定终止条件
//确定单层递归逻辑
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left !=NULL && right!=NULL) return root;
if(left ==NULL && right!=NULL) return right;
else if(left !=NULL && right==NULL) return left;
else return NULL;
}