• 代码随想录 --- day21 --- 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先


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

    题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值

    注意是二叉搜索树,二叉搜索树可是有序的。

    遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。

    1. class Solution {
    2. private:
    3. vector<int> vec;
    4. void traversal(TreeNode* root) {
    5. if (root == NULL) return;
    6. traversal(root->left);
    7. vec.push_back(root->val); // 将二叉搜索树转换为有序数组
    8. traversal(root->right);
    9. }
    10. public:
    11. int getMinimumDifference(TreeNode* root) {
    12. vec.clear();
    13. traversal(root);
    14. if (vec.size() < 2) return 0;
    15. int result = INT_MAX;
    16. for (int i = 1; i < vec.size(); i++) { // 统计有序数组的最小差值
    17. result = min(result, vec[i] - vec[i-1]);
    18. }
    19. return result;
    20. }
    21. };

    501.二叉搜索树中的众数


    既然是搜索树,它中序遍历就是有序的

    二叉树:搜索树的最小绝对差 (opens new window)中我们就使用了pre指针和cur指针的技巧,这次又用上了。

    弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。

    而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。

    频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。

    1. class Solution {
    2. private:
    3. int maxCount = 0; // 最大频率
    4. int count = 0; // 统计频率
    5. TreeNode* pre = NULL;
    6. vector<int> result;
    7. void searchBST(TreeNode* cur) {
    8. if (cur == NULL) return ;
    9. searchBST(cur->left); // 左
    10. // 中
    11. if (pre == NULL) { // 第一个节点
    12. count = 1;
    13. } else if (pre->val == cur->val) { // 与前一个节点数值相同
    14. count++;
    15. } else { // 与前一个节点数值不同
    16. count = 1;
    17. }
    18. pre = cur; // 更新上一个节点
    19. if (count == maxCount) { // 如果和最大值相同,放进result中
    20. result.push_back(cur->val);
    21. }
    22. if (count > maxCount) { // 如果计数大于最大值频率
    23. maxCount = count; // 更新最大频率
    24. result.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
    25. result.push_back(cur->val);
    26. }
    27. searchBST(cur->right); // 右
    28. return ;
    29. }
    30. public:
    31. vector<int> findMode(TreeNode* root) {
    32. count = 0;
    33. maxCount = 0;
    34. TreeNode* pre = NULL; // 记录前一个节点
    35. result.clear();
    36. searchBST(root);
    37. return result;
    38. }
    39. };

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

    首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。 即情况一:

    判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。

    节点本身p(q),它拥有一个子孙节点q(p)

    1. class Solution {
    2. public:
    3. TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    4. if (root == q || root == p || root == NULL) return root;
    5. TreeNode* left = lowestCommonAncestor(root->left, p, q);
    6. TreeNode* right = lowestCommonAncestor(root->right, p, q);
    7. if (left != NULL && right != NULL) return root;
    8. if (left == NULL && right != NULL) return right;
    9. else if (left != NULL && right == NULL) return left;
    10. else { // (left == NULL && right == NULL)
    11. return NULL;
    12. }
    13. }
    14. };

  • 相关阅读:
    C++入门【下】—— 预处理与内联函数关系
    ETest系列产品1 | 便捷式嵌入式系统半实物仿真测试平台ETest_PT
    JWFD开源工作流-矩阵大模型的最新进展
    SpringMVC
    【1656. 设计有序流】
    从零开始配置vim(21)——会话管理
    【信息安全】浅谈IDOR越权漏洞的原理、危害和防范:直接对象引用导致的越权行为
    Safari浏览器打不开该网址,因为网址无效(解决办法)
    再谈 FireBird 的自增字段用 FireDAC 来处理
    关于数据链路层(初步)
  • 原文地址:https://blog.csdn.net/Accelerated/article/details/132645466