首页 > 编程语言 >算法刷题 Day 21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

算法刷题 Day 21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

时间:2023-01-28 12:55:20浏览次数:55  
标签:pre TreeNode 二叉 搜索 二叉树 return NULL root

今日内容

  • 530.二叉搜索树的最小绝对差
  • 501.二叉搜索树中的众数
  • 236. 二叉树的最近公共祖先   

详细布置

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

需要领悟一下二叉树遍历上双指针操作,优先掌握递归

题目链接/文章讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E5%B7%AE.html

视频讲解:https://www.bilibili.com/video/BV1DD4y11779

Tips:

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

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

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

最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。但其实在二叉搜素树中序遍历的过程中,我们就可以直接计算了。需要用一个pre节点记录一下cur节点的前一个节点。

这里记录pre节点和最终结果需要用到全局变量。同时要记得在中序遍历后及时更新Pre节点。

我的题解:

class Solution {
public:
    int result = INT_MAX;
    TreeNode* pre = NULL;
    void travelsal(TreeNode* node){
        if(node == NULL) return;
        travelsal(node->left);
        if(pre!=NULL){
            int difference = node->val - pre->val;
            result = result < difference ? result : difference;
        }
        // 记得更新Pre节点
        pre = node;
        travelsal(node->right);
    }   

    int getMinimumDifference(TreeNode* root) {
        travelsal(root);
        return result;
    }
};

501.二叉搜索树中的众数

和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码技巧。

可以先自己做做看,然后看我的视频讲解。

https://programmercarl.com/0501.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E4%BC%97%E6%95%B0.html

视频讲解:https://www.bilibili.com/video/BV1fD4y117gp

Tips:这一题思路倒是很好理解,但就是实现时候的细节需要注意

1. 注意对第一个节点的处理逻辑

2. 注意更新pre指针

我的题解:

class Solution {
public:
    TreeNode* pre = NULL;
    vector<int> mode;
    int maxCount = 0;
    int count = 0;

    void traversal(TreeNode* root){
        if(root == NULL){
            return;
        }

        traversal(root->left);
        
        if(pre == NULL || pre->val == root->val){
            count++;
        }
        else if(pre->val != root->val){
            count = 1;
        }

        pre = root;

        if(count == maxCount){
            mode.push_back(root->val);
        }

        if(count > maxCount){
            maxCount = count;
            mode.clear();
            mode.push_back(root->val);
        }

        traversal(root->right);
        return;
    }

    vector<int> findMode(TreeNode* root) {
        traversal(root);
        return mode;
    }
};

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

本题其实是比较难的,可以先看我的视频讲解

https://programmercarl.com/0236.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html

视频讲解:https://www.bilibili.com/video/BV1jd4y1B7E2

Tips:这道题用到了回溯的思想。需要认真审题,题目中说了p 和 q 均存在于给定的二叉树中。因此不需要考虑有一个节点或两个节点都不存在于二叉树中的情况,也正是因此,在代码开头遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本身就是 公共祖先的情况。

我的题解:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本身就是 公共祖先的情况
        if(root == p || root == q || 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;
    }
    else if(left!= NULL && right == NULL){
        return left;
    }
    else if(left == NULL && right != NULL){
        return right;
    }
    else{
        return NULL;
    }

    }
};

 

标签:pre,TreeNode,二叉,搜索,二叉树,return,NULL,root
From: https://www.cnblogs.com/GavinGYM/p/17070116.html

相关文章

  • 94. 二叉树的中序遍历
    问题链接https://leetcode.cn/problems/binary-tree-inorder-traversal/description/解题思路二叉树的中序遍历。其实深搜和递归是一个道理。搜索必然要通过递归来实现......
  • 算法入门--搜索插入位置
    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。 ......
  • 代码随想录算法训练营第十三天 二叉树 | 二叉树深度优先遍历 | lc144 二叉树的前序遍
    二叉树种类满二叉树层数为n,节点数为\(2^n-1\)的二叉树完全二叉树除了底层都是满的,底层不一定满,但是从左到右连续二叉搜索树按一定顺序排列的二叉数,如某节点左侧节点......
  • 力扣111 二叉树的最小深度
    题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例:输入:root=[3,9,20,nul......
  • 力扣104 二叉树的最大深度
    题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,nu......
  • 【Matlab学习1】操作界面、搜索路径
    Matlab(MatrixLaboratry)MATLAB官方文档(点击此处跳转)Matlab优势:  1.简单易用。不需要过多了解各种数值计算方法的具体细节和计算公式,也不需要繁琐的底层编程。  2.有......
  • 二叉树前序、中序、后序遍历非递归写法
    packagedayone.tre;importjava.util.Stack;publicclassPreorderTraversal{/****先序遍历非递归写法*@paramhead*/publicstati......
  • 二叉树公共祖先问题
    packagedayone.tre;/****o1和o2为head二叉树中的点,找出o1和02的最近公共祖先*/publicclassTest{publicstaticNodelowestAncestor(Nodehead,Nodeo......
  • 二叉堆模板
    constexprintN=10001;structHeap{ intdatA[N];//startfrom1 intsiz; //int(*topper)(int,int);#definetopper(a,b)((a)<(b)) voidup(intid){ w......
  • 堆和二叉树的关系
    逻辑结构VS物理结构堆:逻辑结构是一颗二叉树(如下图)物理结构是一个数组(如下代码) //上图是一个堆(从小到大)可以用数组表示constheap=[-1,10,14,25,33,81,......