刷题打卡day 21 : 530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

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

class Solution {
private:
int result = INT_MAX;//设置result记录两值之差绝对值最小值,首先设置成INT_MAX
TreeNode* pre = NULL;
void traversal(TreeNode* cur) {
    if (cur == NULL) return;
    traversal(cur->left);   // 左
    //双指针法,当pre != NULL才可以进行操作,不能操作空指针
    //第一轮循环pre = NULL,不进入result的比较。
    if (pre != NULL){       // 中
        result = min(result, cur->val - pre->val);
    }
    pre = cur; // 记录前一个,上面比较完了,现在pre一直指向cur的前一个节点,搜索树相邻指针就这么写
    traversal(cur->right);  // 右
}
public:
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return result;
    }
};

501.二叉搜索树中的众数

class Solution {
private:
    int maxCount = 0; // 记录最大频率
    int count = 0; // 记录统计频率
    TreeNode* pre = NULL;//双指针法,记录前一个指针
    vector result;//结果数组
    void searchBST(TreeNode* cur) {
        if (cur == NULL) return ;
        //搜索树,中序遍历。左中右
        searchBST(cur->left);       // 左
        // 中
        if (pre == NULL) { // 第一个节点
            count = 1;
        } else if (pre->val == cur->val) { // 与前一个节点数值相同
            count++;
        } else { // 与前一个节点数值不同
            count = 1;
        }
        pre = cur; // 更新上一个节点,搜索树双指针法标准记录前一个节点的方法

        if (count == maxCount) { // 如果和最大值相同,放进result中
            result.push_back(cur->val);
        }

        if (count > maxCount) { // 如果计数大于最大值频率
            maxCount = count;   // 更新最大频率
            result.clear();     // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
            result.push_back(cur->val);
        }

        searchBST(cur->right);      // 右
        return ;
    }

public:
    vector findMode(TreeNode* root) {
        count = 0;
        maxCount = 0;
        TreeNode* pre = NULL; // 记录前一个节点
        result.clear();

        searchBST(root);
        return result;
    }
};

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

没有目标值就返回空?

中要根据左右节点的结果来判断。后序递归,然后才有中的逻辑。

通过回溯逐渐向上返回

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //终止条件
        //遇到空的话,因为树都是空了,所以返回空。
        //那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,
        //这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面写
        if (root == q || root == p || root == NULL) return root;

        //左右都要用值接住,递归函数是有返回值的
        TreeNode* left = lowestCommonAncestor(root->left, p, q);//左
        TreeNode* right = lowestCommonAncestor(root->right, p, q);//右

        //中:中要根据左右节点的结果来判断。后序递归,然后才有中的逻辑。
        //通过回溯逐渐向上返回
        if (left != NULL && right != NULL) return root;//说明下面有pq,说明现在的root就是
        if (left == NULL && right != NULL) return right;//右不为空,说明右面有p或者q
        else if (left != NULL && right == NULL) return left;//同上,左面有
        else  { //  (left == NULL && right == NULL)
            return NULL;//都没有,返回null
        }

    }
};

你可能感兴趣的:(算法,leetcode,数据结构)