首页 > 编程语言 >算法训练day22 LeetCode235

算法训练day22 LeetCode235

时间:2023-09-27 16:44:40浏览次数:39  
标签:LeetCode235 TreeNode val day22 算法 return root 节点 left

算法训练day22 LeetCode235.701.450.

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

题目

235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 对于二叉树,可以用递归回溯的方式

  • 对于二叉搜索树,由其根节点大于左右子树中结点,所以当第一次遍历到根节点值在[p,q]之间时,此节点为最近公告祖先

  • 递归遍历单支

    • class Solution
      {
      public:
          TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q)
          {
              {
                  if (root->val > p->val && root->val > q->val)
                  {
                      return lowestCommonAncestor(root->left, p, q);
                  }
                  else if (root->val < p->val && root->val < q->val)
                  {
                      return lowestCommonAncestor(root->right, p, q);
                  }
                  else
                      return root;
              }
          }
      };
      
  • 迭代遍历

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

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

题目

701. 二叉搜索树中的插入操作 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 根据二叉平衡树特点遍历,找到空节点插入即可(函数有返回值)

  • class Solution
    {
    public:
        TreeNode *insertIntoBST(TreeNode *root, int val)
        {
            if (root == NULL)
            {
                TreeNode *node = new TreeNode(val);
                return node;
            }
            if (root->val > val)
                root->left = insertIntoBST(root->left, val);
            if (root->val < val)
                root->right = insertIntoBST(root->right, val);
            return root;
        }
    };
    
  • 递归遍历(函数无返回值)

  • class Solution
    {
    private:
        TreeNode *parent;
        void traversal(TreeNode *cur, int val)
        {
            if (cur == NULL)
            {
                TreeNode *node = new TreeNode(val);
                if (val > parent->val)
                    parent->right = node;
                else
                    parent->left = node;
                return;
            }
            parent = cur;
            if (val > cur->val)
                traversal(cur->right, val);
            if (val < cur->val)
                traversal(cur->left, val);
        }
    
    public:
        TreeNode *insertIntoBST(TreeNode *root, int val)
        {
            parent = new TreeNode(0);
            if (root == NULL)
            {
                root = new TreeNode(val);
            }
            traversal(root, val);
            return root;
        }
    };
    

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

题目

450. 删除二叉搜索树中的节点 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 递归

    • 函数的参数是根节点值和目标值,返回值是子节点指针

    • 中止条件:

      • 节点为空-->没有找到目标 直接返回检查的节点指针即可
      • 节点值等于目标值
        • 节点为叶子节点,直接删除,返回空
        • 只有左子节点,返回左子节点
        • 只有右子节点,返回右子节点
        • 左右均有,将左子节点连接在右子节点最深左子节点之后,删除左子节点,返回右子节点
    • 单层逻辑:目标值大于节点值则遍历右子树,并用右子树承接深一层递归的返回值

    • class Solution
      {
      public:
          TreeNode *deleteNode(TreeNode *root, int key)
          {
              if (root == NULL)
                  return root;
              if (root->val == key)
              {
                  if (root->left == NULL)
                      return root->right;
                  else if (root->right == NULL)
                      return root->left;
                  else
                  {
                      TreeNode *cur = root->right;
                      while (cur->left != NULL) // 找到要删除节点的最底层左节点
                      {
                          cur = cur->left;
                      }
                      cur->left = root->left;
                      TreeNode *tmp = root;	//标记待删除节点,准备删除
                      root = root->right;
                      delete tmp;
                      return root;
                  }
              }
              if (root->val > key)
                  root->left = deleteNode(root->left, key);
              if (root->val < key)
                  root->right = deleteNode(root->right, key);
              return root;
          }
      };
      

标签:LeetCode235,TreeNode,val,day22,算法,return,root,节点,left
From: https://www.cnblogs.com/High-source/p/17733066.html

相关文章

  • 大模型深挖数据要素价值:算法、算力之后,存储载体价值凸显
    文|智能相对论作者|叶远风18.8万亿美元,这是市场预计2030年AI推动智能经济可产生的价值总和,其中大模型带来的AI能力质变无疑成为重要的推动力量。大模型浪潮下,业界对AI发展的三驾马车——算力、算法、数据任何一个维度的关注都到了全新的高度,避免“木桶效应”成为大模型发展首要......
  • 遗传算法解决01背包问题
    遗传算法解决01背包问题一、问题描述01背包问题是组合优化问题的一个典型例子,它要求在许多可行解中找到一个最优解。01背包问题的一般描述如下:给定一个固定的背包容量和一组物品,每个物品有一个重量和一个价值,要求从这组物品中选择一些放入背包,使得背包中物品的总价值最大,同时不......
  • WEBRTC回声消除-AECM算法源码解析之参数解析
    一概述 webrtc针对回声问题一共开源了3种回声消除算法,分别为aec,aecm,以及aec3,其中aec是最早期的版本,在后续的更新中aec3的出现代替了aec在webrtc中的地位,而aecm主要是针对计算能力较弱的移动端或是嵌入式设备而开发的,但同时也带来了它自己的劣势;本文主要介绍AECM算法的计......
  • 跑腿系统开发:构建实时任务分配算法的技术挑战
    在跑腿系统中,实时任务分配算法是确保任务快速高效完成的关键因素之一。本文将介绍构建实时任务分配算法时可能面临的技术挑战,并提供一个简单的Python示例来解决这些挑战。技术挑战:实时数据处理:跑腿系统需要处理大量的实时任务请求,这需要高效的数据处理能力。我们可以使用队列来管......
  • 文心一言 VS 讯飞星火 VS chatgpt (96)-- 算法导论9.3 1题
    一、用go语言,在算法SELECT中,输人元素被分为每组5个元素。如果它们被分为每组7个元素,该算法仍然会是线性时间吗?证明:如果分成每组3个元素,SELECT的运行时间不是线性的。文心一言:在算法分析中,一个算法的运行时间是否线性依赖于其输入数据的大小。线性时间意味着算法的运行时......
  • 文心一言 VS 讯飞星火 VS chatgpt (97)-- 算法导论9.3 3题
    三、用go语言,假设所有元素都是互异的,说明在最坏情况下,如何才能使快速排序的运行时间为O(nlgn)。文心一言:快速排序是一种基于分治策略的排序算法,其平均时间复杂度为O(nlgn)。在最坏情况下,快速排序的时间复杂度为O(n^2),这是因为当输入数组已经排序或接近排序时,快速排序的性能会退化。......
  • 视频融合/监控汇聚平台EasyCVR助力AI算法智能防溺水,实现水域监管
    防溺水已经成为青少年安全教育的重要内容,同时也是社会各界共同承担的安全管理责任。特别是在夏季,随着天气逐渐转热,溺水事故也进入了危险期、易发期和高发期。传统的预防和管理方法主要通过日常宣传演讲和人工巡逻来提醒人们溺水的危害,但存在一些问题:1)缺乏有效的安全预警设施:当人......
  • WOA-ELM分类预测 | Matlab 鲸鱼算法(WOA)优化极限学习机(ELM)的分类预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • UE4里的数据结构与算法
    在CoreMinimal.h的头文件里可以看到最常使用的头文件数据结构:Plane(平面)、Sphere(椭圆)、Box(四边形外接框)、Edge(边)等。算法:Core\Public\Algo文件夹下 ......
  • 9.27算法
    环形链表给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos不作为参数进行传递 。仅仅是为了......