算法训练营day21_二叉树(2.29补)
530.二叉搜索树的最小绝对差
二叉搜索树中序遍历是有序的,在其上找最值,差值,别忘了这个性质;
中序遍历一遍放到数组,更新最小差值;
还可以直接在遍历过程中更新最小插值;
class Solution {
public:
vector<int> V;
void dfs(TreeNode* root){
if(root==NULL) return;
dfs(root->left);
V.push_back(root->val);
dfs(root->right);
}
int getMinimumDifference(TreeNode* root) {
V.clear();
dfs(root);
int ans=1e6;
for(int i=1;i<V.size();i++){
ans=min(V[i]-V[i-1],ans);
}
return ans;
}
};
501.二叉搜索树中的众数
中序遍历放到vector里;
遍历一遍vector找出最多个数的数量;
再遍历一遍,若数量等于众数数量,放到ans里;
class Solution {
public:
vector<int> V;
vector<int> ans;
void dfs(TreeNode* t){
if(t==NULL) return;
dfs(t->left);
V.push_back(t->val);
dfs(t->right);
}
vector<int> findMode(TreeNode* root) {
V.clear();
ans.clear();
dfs(root);
int maxCnt=0;
for(int i=0;i<V.size();i++){
int j=i;
while(j<V.size()&&V[j]==V[i]){
j++;
}
maxCnt=max(maxCnt,j-i);
i=j-1;
}
for(int i=0;i<V.size();i++){
int j=i;
while(j<V.size()&&V[j]==V[i]){
j++;
}
if(j-i==maxCnt) ans.push_back(V[i]);
i=j-1;
}
return ans;
}
};
236.二叉树的最近公共祖先
后序遍历,先把左孩子,右孩子存下来,然后是中点的逻辑;
如果一个点是最近公共祖先,那么一定是左孩子包括p(q),右孩子包括q(p);
终止条件:如果中点本身是NULL,返回空,中点是p或者q,返回中点;
存左孩子,右孩子;
如果左右孩子都不为空,中点就是最近公共祖先,返回中点上去;
如果左右孩子有一个不空,返回那个不空的上去;
如果左右孩子都为空,返回空;
class Solution {
public:
TreeNode* dfs(TreeNode* t,TreeNode*p,TreeNode* q){
if(t==NULL) return NULL;
TreeNode* l=dfs(t->left,p,q);
TreeNode* r=dfs(t->right,p,q);
if(l!=NULL&&r!=NULL||t==p||t==q) return t;
if(l==NULL&&r!=NULL) return r;
if(l!=NULL&&r==NULL) return l;
return NULL;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return dfs(root,p,q);
}
};