11.10数Ⅴ

6.18二叉搜索树的最小绝对差

class Solution {
public:
    vector<int> vec;
    void traversal(TreeNode * bt){//将二叉搜索树的所有结点放入容器中,中序遍历
        if(!bt) return;
        traversal(bt->left);
        vec.push_back(bt->val);
        traversal(bt->right);
    }

    int getMinimumDifference(TreeNode* root) {
        int result = INT_MAX;
        traversal(root);
        for(int i=1;i<vec.size();i++){//i从1开始
            result = min(vec[i]-vec[i-1],result);//找寻result和当前值减去前一个值的插值(正数)之间的更小的值
        }
        return result;
    }
};

6.19二叉搜索树的众数

class Solution {
public:
    vector<int> vec;
    vector<int> result = {0};
    void traversal(TreeNode* bt){
        if(!bt) return;
        traversal(bt->left);
        vec.push_back(bt->val);
        traversal(bt->right);
    }

    vector<int> findMode(TreeNode* root) {    
        traversal(root);
        int count = 0;
        int maxfreq=0;//最大频率数
        if(vec.size()==0) return result;
        for(int i = 1;i < vec.size();i++){
            if(vec[i]==vec[i-1])//当前与前一个相等则计数加一
                count++;
            else 
                count = 0;
            if(count==maxfreq)//计数的值是最大值则纳入容器
                result.push_back(vec[i]);
            if(count>maxfreq){//计数值大于最大值则先删除容器所有值,再将当前值纳入
                maxfreq = count;
                result.clear();
                result.push_back(vec[i]);
            }
        }
        return result;
    }
};

6.20二叉树的最近公共祖先

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == p||root == q||!root) return root;//当存在p或q就是公共结点时,其子树包含p,q不需要遍历
        TreeNode* leftnode = lowestCommonAncestor(root->left,p,q);
        TreeNode* rightnode = lowestCommonAncestor(root->right,p,q);
        if(leftnode && rightnode) 
            return root;

        if(!leftnode && rightnode) //左子树返回null,右子树存在,则仅仅返回右子树
            return rightnode;
        else if(!rightnode && leftnode) 
            return leftnode;
        else//左右子树都不存在,即都返回NULL
            return NULL;
    }
};

6.21二叉搜索树的最近公共祖先

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root->val>p->val && root->val>q->val)//当前根节点的值大于p且q,根据BST,应该去寻找左子树
            return lowestCommonAncestor(root->left,p,q);
        else if(root->val<p->val && root->val<q->val)
            return lowestCommonAncestor(root->right,p,q);
        else//此时根节点的值[p,q]这个区间在,且是第一次找到这个区间的数,即是公共结点
            return root;
    }
};
posted @ 2023-11-11 17:02  Ref-rain-  阅读(9)  评论(0)    收藏  举报