首页 > 编程语言 >代码随想录算法训练营第二十二天 | 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

代码随想录算法训练营第二十二天 | 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

时间:2024-06-03 14:10:17浏览次数:17  
标签:right TreeNode val root 二叉 搜索 return 树中 left

235.二叉搜索树的最近公共祖先

题目链接 文章讲解 视频讲解

思路:递归遍历二叉搜索树
   如果当前值大于p和q的值,向左遍历
   如果当前值小于p和q的值,向右遍历
   否则说明当前值介于p和q之间,直接返回当前节点

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == nullptr) return nullptr;
        if(root->val > p->val && root->val > q->val) {
            TreeNode* left = lowestCommonAncestor(root->left, p, q);
            if(left) return left;
        }
        if(root->val < p->val && root->val < q->val) {
            TreeNode*right = lowestCommonAncestor(root->right, p, q);
            if(right) return right;
        }
        return root;
    }
};

701.二叉搜索树中的插入操作

题目链接 文章讲解 视频讲解

思路:遍历至空节点插入即可

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root == nullptr) {
            root = new TreeNode(val);
            return root;
        }
        insert(root, val);
        return root;
    }
    void insert(TreeNode* node, int val) {
        // 当前节点大于插入值,向左遍历
        if(node->val > val) {
            if(node->left) insertIntoBST(node->left, val);
            else node->left = new TreeNode(val);
        }
        // 当前节点小于插入值,向右遍历
        if(node->val < val) {
            if(node->right) insertIntoBST(node->right, val);
            else node->right = new TreeNode(val);         
        }
        return ;
    }
};

450.删除二叉搜索树中的节点

题目链接 文章讲解 视频讲解

难点:当待删除的节点的左右子树都不为空时:
   将当前节点的左子树挂载到右子树的最左边;
   然后将当前指针指向当前节点的右子树。

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        // 1.如果根节点为空,或者没有找到key,直接返回nullptr
        if(root == nullptr) return nullptr;
        // 如果找到key
        if(root->val == key) {
            // 2.如果待删除节点的左右孩子都为空,直接删除节点返回nullptr 
            if(!root->left && !root->right) {
                delete root;
                return nullptr;
            }
            // 3.如果待删除节点左孩子不为空,右孩子为空
            else if(root->left && !root->right) {
                TreeNode* tem = root->left;
                delete root;
                return tem;
            }
            // 4.如果待删除节点的右孩子不空,左孩子为空
            else if(!root->left && root->right) {
                TreeNode* tem = root->right;
                delete root;
                return tem;
            }
            // 5.如果待删除节点的左右孩子都不为空
            else {
                TreeNode* tem = root;
                TreeNode* cur = root->right;
                while(cur->left) cur = cur->left;
                cur->left = root->left;            
                root = root->right;
                delete tem;
                return root;
            }
        }
        if(root->val > key) {
            root->left = deleteNode(root->left, key);
        }
        if(root->val < key) {
            root->right = deleteNode(root->right, key);
        }
        return root;
    }
};

标签:right,TreeNode,val,root,二叉,搜索,return,树中,left
From: https://www.cnblogs.com/cscpp/p/18228251

相关文章

  • 淘宝商品id怎么实现批量自动获取?通过关键字搜索接口来获取批量商品id(淘宝API)
    item_search-按关键字搜索淘宝商品传入商品关键字,通常在商品标题中进行检索,将包含此关键字的商品展示出来,分页展示。公共参数名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,i......
  • 101. 对称二叉树
    简单 相关标签相关企业 给你一个二叉树的根节点 root ,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false 提示:树中节点数目在范围 [1,1000] 内-100<=Node.val<=100 进阶:......
  • 代码随想录算法训练营第二十一天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众
    530.二叉搜索树的最小绝对差题目链接文章讲解视频讲解关键词:二叉搜索树-->中序遍历关于递归的返回值  由于需要遍历整棵二叉树,所以返回值为void,如果不是遍历整棵二叉树,需要在得到结果时立即返回结果,此时返回值才不为空怎样使用两个指针pre和cur使得pre始终指向cur的前......
  • 城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(二)
    我们在之前的文章“城市之旅:使用LLM和Elasticsearch简化地理空间搜索(一)”,在今天的练习中,我将使用本地部署来做那里面的Jupyternotebook。安装Elasticsearch及Kibana如果你还没有安装好自己的Elasticsearch及Kibana,请参考如下的链接来进行安装:如何在Linux,Mac......
  • 代码随想录算法训练营第二十天 | 654.最大二叉树 617.合并二叉树 二叉搜索树
    654.最大二叉树题目链接文章讲解视频讲解classSolution{public:TreeNode*constructMaximumBinaryTree(vector<int>&nums){returninorderTraversal(nums,0,nums.size()-1);}TreeNode*inorderTraversal(vector<int>&nums,intbegi......
  • Part 3.1 深度优先搜索
    深度优先搜索(DFS),即按照深度优先的顺序搜索的算法。深度优先搜索一般使用栈来实现。[USACO1.5]八皇后CheckerChallenge题目描述一个如下的6×6......
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解
    广度优先搜索(Breadth-FirstSearch,简称BFS)是一种用于图或者树的搜索算法,它的特点是按照“广度”进行搜索,即在扩展搜索路线的时候,BFS会先考虑当前节点的所有邻近节点,也就是说,它逐层地进行搜索。文章目录基本原理实现方法应用场景总结基本原理广度优先搜索的基本......
  • 华为od机考_精准核酸检测_Java(深度优先搜索)
    华为od机考_精准核酸检测_Java题目为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准還定可能被感染的人群。现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。现在给定一组确诊人员编号(X1,X2,X3,…Xn),在所有人当中......
  • 算法学习笔记——二分搜索
    二分搜索在有序数组中确定num存在还是不存在:当arr[m]==num,则num存在当arr[m]>num,则r=m-1,缩小r的范围,继续往左二分当arr[m]<num,则l=m+1,缩小l的范围,继续往右二分//保证arr有序,才能用这个方法publicstaticboolenexist(int[]arr,intnum){if(ar......
  • 二叉树链式结构的前序、中序、后序、层序遍历
    文章目录一、二叉树创建二、前序遍历概念以及解释代码三、中序遍历概念及解释代码四、后序遍历概念及解释代码五、层序遍历概念及解释代码一、二叉树创建&mesp; 实现二叉树的遍历,我们要先手搓出一个二叉树,在次基础上实现二叉树的前序、中序、后序、层序遍历。......