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

目录

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

二、501. 二叉搜索树中的众数

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


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

题目链接:力扣

文章讲解:代码随想录

视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差

题目:

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

class Solution {
public:
    TreeNode* pre = NULL;
    void dfs(int &result, TreeNode* root){
        if(root->left) dfs(result, root->left);
        if(pre) result = min(abs(root->val-pre->val), result);
        pre = root;
        if(root->right) dfs(result, root->right);
        return;
    }
    int getMinimumDifference(TreeNode* root) {
        int result = INT_MAX;
        dfs(result, root);
        return result;
    }
        /*stack st;
        TreeNode *pre = NULL;
        int ans = INT_MAX;
        while (root || !st.empty())
        {
            if (root)
            {
                st.push(root);
                root = root->left;
            }
            else
            {
                root = st.top();
                st.pop();
                if (pre)
                    ans = min(ans, root->val - pre->val);
                pre = root;
                root = root->right;
            }
        }*/
        return ans;
    }
};

时间复杂度: O(n)                                        空间复杂度: O(n)

⏲:2:49

总结:1.中序遍历相当于数组,遇到在二叉搜索树上求最值、差值,可以考虑二叉树中序遍历的有序性。2.前,后指针的运用,pre的第一个值(一般为NULL)和更新值。

二、501. 二叉搜索树中的众数

题目链接:力扣

文章讲解:代码随想录

视频讲解:不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数

题目:给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* pre = NULL;
    void dfs(vector &result, TreeNode* root, int &count, int &max){
        if(root->left) dfs(result, root->left, count, max);

        if(pre && pre->val == root->val) count++;
        else count = 1;
        if(count >= max) {
            if(count > max) result.clear();
            max = count;
            result.push_back(root->val);
        }
        pre = root;
        if(root->right) dfs(result, root->right, count, max);
        return;
    }
    vector findMode(TreeNode* root) {
        vector result;
        int count = 1;
        int max = 0;
        if (root) dfs(result, root, count, max);
        return result;
    }
};

时间复杂度: O(n)                                        空间复杂度: O(n)

⏲:7:37

总结:1.普通二叉树的高频众数,要用map。2.二叉搜索树的众数,可用数组的clear来避免二次遍历。

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

题目链接:力扣

文章讲解:代码随想录

视频讲解:自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先

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

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

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(!root || root == p || root == q) return root;
        TreeNode* left = lowestCommonAncestor(root->left, p ,q);
        TreeNode* right = lowestCommonAncestor(root->right, p ,q);
        if(left && right) return root;
        if(left) return left;
        else return right;

    }
};

时间复杂度: O(n)                                        空间复杂度: O(n)

⏲:9:19

总结:自下而上——回溯——二叉树的后序遍历。

你可能感兴趣的:(算法)