DAY18 - 530.二叉搜索树的最小绝对差, 501.二叉搜索树中的众数, 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差

是BST,利用它的性质中序遍历一次即可得到结果。

class Solution {
public:
    void traversal(TreeNode* node, int& mini, TreeNode*& pre){
        if(node==nullptr) return;
        traversal(node->left,mini,pre);
        if(pre!=nullptr){
            mini=min(mini,node->val-pre->val);
        }
        pre=node;
        traversal(node->right,mini,pre);
    }

    int getMinimumDifference(TreeNode* root) {
        int min=INT_MAX;
        TreeNode* pre=nullptr;
        traversal(root,min,pre);
        return min;
    }
};
  • 在递归中需要注意什么时候按值传递什么时候引用传递。如果需要一个值在不同递归过程中都存在就要引用传递。

501.二叉搜索树中的众数

一开始想的是用map来记录每个数的出现频率,但是其实并不关注每个数的出现频率,只关注最大出现频率和结果数组,所以用一个int和一个vector作为额外空间即可。

class Solution {
private:
    int maxcnt=0;
    int cnt=0;
    vector<int> res;
    TreeNode* pre=nullptr;
    void traversal(TreeNode* node){
        if(node==nullptr) return;
        traversal(node->left);
        if(pre!=nullptr){
            if(pre->val==node->val) cnt++;
            else cnt=1;

            if(cnt>maxcnt){
                maxcnt=cnt;
                res.clear();
                res.push_back(node->val);
            }else if(cnt==maxcnt){
                res.push_back(node->val);
            }
        }else{
            cnt=1;
            maxcnt=1;
            res.push_back(node->val);
        }
        pre=node;
        traversal(node->right);
    }

public:
    vector<int> findMode(TreeNode* root) {
        traversal(root);
        return res;
    }
};

236. 二叉树的最近公共祖先

一开始的想法是回溯法,记录到两个目标节点的path,然后再从后到前遍历path,找到交汇点。

后序遍历即可实现回溯,因为后序是左右中这个顺序。

公共祖先就两种情况:

  1. root左子树中有p,右子树中有q

  2. root自己就是p,左子or右子树中有q

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
       if(root==nullptr) return nullptr;
       if(root==p||root==q) return root;

       TreeNode* left=lowestCommonAncestor(root->left,p,q);
       TreeNode* right=lowestCommonAncestor(root->right,p,q);
       
       if(left!=nullptr&&right!=nullptr) return root;
       if(left!=nullptr&&right==nullptr) return left;
       if(left==nullptr&&right!=nullptr) return right;

       return nullptr; 
    }
};
posted @ 2025-04-12 20:30  ChloeChen0221  阅读(8)  评论(0)    收藏  举报