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

二叉搜索树:中序序列严格递增

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

思路:
根据二叉搜索树中序遍历为严格递增序列,pre是当前节点root的左节点,或者root是pre的右节点,是递增关系
特殊情况:

代码实现

class Solution {
public:
    TreeNode* pre;
    int Minde = INT_MAX;
    int getMinimumDifference(TreeNode* root) {
        if(root == NULL) return Minde;
        
        getMinimumDifference(root->left);
        //根据中序遍历,pre是当前节点root的左节点,或者root是pre的右节点,是递增关系
        //所以最小差值只可能出现在中序序列的相邻节点之间
        if(pre != NULL && root->val - pre->val < Minde) Minde = root->val - pre->val;
        pre = root;
        
        getMinimumDifference(root->right);

        return Minde;
    }
};

501.二叉搜索树中的众数

思路:
既然是搜索树,它中序遍历就是有序的。
中序序列保证相同数字是连续的,可以遍历累加计数
特殊情况:
1、频率CurTime大于 maxTime的时候,不仅要更新maxTime,
而且要清空结果集(以下代码为numV数组),因为结果集之前的元素都失效了,再加入结果集
2、频率CurTime 等于 maxTime的时候,将该值加入result数组(因为可能存在多个众数)

代码实现

class Solution {
public:
    int maxTime = 0;
    int CurTime = 0;
    vector numV;
    int pre = -1;
    vector findMode(TreeNode* root) {
        if(root == nullptr) return numV;

        findMode(root->left);
        if(root->val != pre){
            CurTime = 0;
            pre = root->val;
        }

        CurTime++;
        if(CurTime == maxTime){
        	//频率CurTime 等于 maxTime的时候,将该值加入result数组(因为可能存在多个众数)
            numV.push_back(root->val);
        }
        else if(CurTime > maxTime){
        	//频率CurTime大于 maxTime的时候,不仅要更新maxTime,
            //而且要清空结果集(以下代码为numV数组),因为结果集之前的元素都失效了,再加入结果集
            if(!numV.empty()) numV.clear();
            numV.push_back(root->val);
            maxTime = CurTime;
        }
        
        findMode(root->right);

        return numV;
    }
};

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

思想:
后序遍历(左右中)即回溯遍历二叉树:
若中节点root == p || root == q,则找到目标节点或最近祖先节点,返回该节点;
若left 和 right都不为空,说明此时root就是最近公共节点,返回该节点;
若left为空,right不为空,则返回right,说明目标节点或最近祖先节点是通过right返回的,反之依然。

代码实现

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL) return root;
        TreeNode* result;
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);

        //若中节点root == p || root == q,则找到目标节点或最近祖先节点,返回该节点;
        if(root == p || root == q){
            return root;
        }

        //若left 和 right都不为空,说明此时root就是最近公共节点,返回该节点;
		//若left为空,right不为空,则返回right,说明目标节点或最近祖先节点是通过right返回的,反之依然。
        if(left != NULL && right != NULL) {
            result = root;
        }
        else if(left != NULL && right == NULL){
            result = left;
        }
        else if(left == NULL && right != NULL){
            result = right;
        }
        
        return result;
    }
};

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