代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差, 501.二叉搜索树中的众数,236. 二叉树的最近公共祖先

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

力扣

1. 凡是需要利用二叉搜索树【升序】性质的,例如查看是否为升序/求相近两数的差值/绝对值,都要用中序遍历

2. 双指针(如果看见需要【比较两个相邻值】):

用一个prev节点记录一下root节点(即当前节点)的前一个节点。先在方法外设置:TreeNode* prev = nullptr。然后每次“中”的时候,比较prev & root 的差值。并令prev = root, 即prev向后移一位,因为接下来递归root也会向后移。注意查prev != nullptr避免出现 nullptr->val.

class Solution {
public:
    vector result;
    int min = INT_MAX;
    TreeNode* prev = nullptr;

    int getMinimumDifference(TreeNode* root) {
        if(root == nullptr) return 0;
        inorder(root);
        return min;
    }

    void inorder(TreeNode* root){
        if(root == nullptr) return;

        inorder(root->left);

        if(prev != nullptr){
            int diff = root->val - prev->val;
            if(diff < min){
                min = diff;
            }
        }
        prev = root; //prev向后移一位,接下来递归root也会向后移
        
        inorder(root->right);
        return;
    }
};

 

 501.二叉搜索树中的众数

力扣

1. 本题依旧是 二叉搜索树 + 需要比较相邻数(是否一样,好统计数字出现个数),所以【中序遍历为升序】。

2. 双指针模板:

if(prev != nullptr){
    比较prev和curr的操作,修改相应值。
}
prev = curr;

中序遍历时,比较prev和root(当前)是否一样,一样就count++(该数出现次数),不一样就count = 1 (注意是1,因为表明一个新的数出现了1次)。注意这一部分只修改count。和maxCount比较在后面。

3. 注意有多个众数的情况(例如:[1,1,2,2]):如果count == maxCount,说明出现了多个众数,result.push_back(maxNum);

4. 出现了【次数更多】的数:if (count > maxCount),一定要先清空result,然后再push maxNum.

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

力扣

1. 想从下往上找,所以用【后序遍历】(左右中)。

2. 分情况讨论

1)左不为空说明当前node的左子树有p或q,右不为空说明右子树有p或q,此时往上返回,“中”就是最近公共祖先。 

2)当前node为p/q,左或右子树有p/q,则公共祖先为当前node。实际操作中与第一种情况逻辑重合。例如p在q上,p是p&q的公共祖先。对于p的父节点parent,就能看到parent->left / parent->right包含p,然后就会把p一直往上传。

3)左子树不为空,右子树为空,说明p/q在该点的左子树。此时带着这个值向上传。反之同理/

4)该node的左右都没找到,说明p&q都不在这个点以下,就返回nullptr,继续向上

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //终止条件1 - 遍历到底了
        if(root == NULL) return NULL;

        //终止条件2 - 如果找到了p或q,则返回该点到上一层,去做判断
        if(root->val == p->val || root->val == q->val) return root;

        //递归
        //左子树有无p/q
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);

        //中
        if(left != NULL && right != NULL){
            return root; //因为left和right是当前的左和右子树
        }

        //p/q在right里,继续向上返回
        if(left == NULL && right != NULL) return right;
        if(left != NULL && right == NULL) return left;

        //该root的左右都没找到,则该root返回空,继续向上
        if(left == NULL && right == NULL) return NULL; 
        return root;
    }

};

你可能感兴趣的:(算法,leetcode,职场和发展,数据结构,c++)