算法训练营day21_二叉树(2.29补)

算法训练营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);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值