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

1. 题目:

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

## 递归

## 中序遍历,找出有序数组,再求最小的差值

class Solution {

private:

    vector<int> vec;

    void traversal(TreeNode* root){

        if(root == NULL) return;

        traversal(root -> left);

        vec.push_back(root -> val);

        traversal(root -> right);

    }

public:

    int getMinimumDifference(TreeNode* root) {

        vec.clear();

        traversal(root);

        if ( vec.size() < 2) return 0;

        int result = INT_MAX;

        for(int i= 1; i < vec.size(); i++){

            result = min(result, vec[i] - vec[i - 1]);

        }

        return result;

    }

};

## 递归 直接判断,不转换数组

class Solution {

private:

int result = INT_MAX;

TreeNode* pre = NULL;

void traversal(TreeNode* cur) {

    if (cur == NULL) return;

    traversal(cur->left);   // 左

    if (pre != NULL){       // 中

        result = min(result, cur->val - pre->val);

    }

    pre = cur; // 记录前一个

    traversal(cur->right);  // 右

}

public:

    int getMinimumDifference(TreeNode* root) {

        traversal(root);

        return result;

    }

};

2. 题目:

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

  • 结点左子树中所含结点的值小于等于当前结点的值
  • 结点右子树中所含结点的值大于等于当前结点的值
  • 左子树和右子树都是二叉搜索树

## 递归

class Solution {

private:

    int maxCount = 0; // 最大频率

    int count = 0; // 统计频率

    TreeNode* pre = NULL;

    vector<int> 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<int> findMode(TreeNode* root) {

        count = 0;

        maxCount = 0;

        pre = NULL; // 记录前一个节点

        result.clear();

        searchBST(root);

        return result;

    }

};

3. 题目:

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

## 递归

class Solution {

public:

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {

        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;

        if (left == NULL && right != NULL) return right;

        else if (left != NULL && right == NULL) return left;

        else  { //  (left == NULL && right == NULL)

            return NULL;

        }

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值