首页 > 编程语言 >算法训练day20 LeetCode654

算法训练day20 LeetCode654

时间:2023-09-25 23:47:18浏览次数:49  
标签:right TreeNode val day20 算法 LeetCode654 NULL root left

算法训练day20 LeetCode654.617.700.98

654.最大二叉树

题目

654. 最大二叉树 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 使用递归

    • 返回节点地址,输入父节点地址,数组
    • 终止条件是输入地数组为空
    • 单层操作:
      • 如果输入数组为空,则返回父节点地址
      • 否则找到数组中最大值、分割数组,对最大值进行操作、将新的两个数组送入深一层递归函数。
  • 修改

    • 输入数组,返回节点
    • 结束条件 数组大小为1
    • 单层递归逻辑不变
  • 代码:

    class Solution
    {
    public:
        TreeNode *constructMaximumBinaryTree(vector<int> &nums)
        {
            TreeNode *node = new TreeNode(0);
            if (nums.size() == 1)
            {
                node->val = nums[0];
                return node;
            }
    
            int maxValue = 0;
            int maxValueIndex = 0;
            for (int i = 0; i < nums.size(); i++)
            {
                if (nums[i] > maxValue)
                {
                    maxValue = nums[i];
                    maxValueIndex = i;
                }
            }
            node->val = maxValue;
    
            if (maxValueIndex > 0)
            {
                vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);
                node->left = constructMaximumBinaryTree(newVec);
            }
            if (maxValueIndex < nums.size() - 1)
            {
                vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());
                node->right = constructMaximumBinaryTree(newVec);
            }
            return node;
        }
    };
    
  • 整体思路没有问题,细节实现需要加强

617.合并二叉树

题目

617. 合并二叉树 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 使用层序遍历

    • 对两个树同时进行层序遍历,遍历时对比节点,在同一节点至少有一棵树存在时将节点记录,空则用NULL标记,记录在两个队列中
    • 对比队列,构建新树
  • 修正

    • 一边遍历一遍更改
    • 通过使用地址的方式实现空位置安装子数
  • 代码:

    class Solution
    {
    public:
        TreeNode *mergeTrees(TreeNode *root1, TreeNode *root2)
        {
            if (root1 == NULL)
                return root2;
            if (root2 == NULL)
                return root1;
            queue<TreeNode *> que;
            que.push(root1);
            que.push(root2);
            while (!que.empty())
            {
                TreeNode *node1 = que.front();
                que.pop();
                TreeNode *node2 = que.front();
                que.pop();
    
                node1->val += node2->val;
    
                if (node1->left != NULL && node2->left != NULL)
                {
                    que.push(node1->left);
                    que.push(node2->left);
                }
                if (node1->right != NULL && node2->right != NULL)
                {
                    que.push(node1->right);
                    que.push(node2->right);
                }
    
                if (node1->left == NULL && node2->left != NULL)
                {
                    node1->left = node2->left;
                }
                if (node1->right == NULL && node2->right != NULL)
                {
                    node1->right = node2->right;
                }
            }
            return root1;
        }
    };
    

700.二叉搜索树中的搜索

题目

700. 二叉搜索树中的搜索 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 搜索树中对于每一根节点,左子树中所有节点值一定均小于根节点的值,右子树中所有节点值一定均大于根节点的值

class Solution
{
public:
    TreeNode *searchBST(TreeNode *root, int val)
    {
        if (root == NULL || root->val == val)
            return root;
        TreeNode *result = NULL;
        if (root->val > val)
            result = searchBST(root->left, val);
        if (root->val < val)
            result = searchBST(root->right, val);
        return result;
    }
};

98.验证二叉搜索树

题目

98. 验证二叉搜索树 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 递归的方式,只需要判断根节点的两个子节点是否满足二叉搜索树的条件

  • 修正:

    • 局部满足条件不一定全局满足条件
  • 平衡二叉树使用中序遍历结果是递增数列

    • 将树经中序遍历转换成数组,判断数组是否递增

    • class Solution
      {
      private:
          vector<int> vec;
          void traversal(TreeNode *root)
          {
              if (root == NULL)
                  return;
              traversal(root->left);
              vec.push_back(root->val);
              traversal(root->right);
          }
      
      public:
          bool isValidBST(TreeNode *root)
          {
              vec.clear();
              traversal(root);
              for (int i = 1; i < vec.size(); i++)
              {
                  if (vec[i] <= vec[i - 1])
                      return false;
              }
              return true;
          }
      };
      
  • 递归

    • class Solution
      {
      public:
          TreeNode *pre = NULL;
          bool isValidBST(TreeNode *root)
          {
              if (root == NULL)
                  return true;
              bool left = isValidBST(root->left);
      
              if (pre != NULL && pre->val >= root->val)
                  return false;
              pre = root;
      
              bool right = isValidBST(root->right);
              return left && right;
          }
      };
      

标签:right,TreeNode,val,day20,算法,LeetCode654,NULL,root,left
From: https://www.cnblogs.com/High-source/p/17729149.html

相关文章

  • 基于图像形态学处理的目标几何形状检测算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述      目标几何形状检测是计算机视觉领域中的重要任务之一,旨在从图像中自动识别和定位不同的几何形状,例如矩形、圆形、三角形等。这些形状检测在许多领域中都具有广泛的应用,如工业自动化......
  • 关于Pohlig-Hellmen算法喵
    \(g^x\equiva(mod\;p)\)当\(g\)为原根时拆分\(p-1=\prod_{i=1}p_i^{ki}\)对于每一个\(p_i\)进行处理将\(x\)转化为\(p\)进制数\(x=c_0+c_1p_i+c_2p_i^2+...+c_{k_i-1}p_i^{k_i-1}\)\(g^{x(\frac{p-1}{p_i})}\equiva^{\frac{p-1}{p_i}}(mod\;p)\)用1展开2中......
  • 【算法】莫队
    一、概念莫队是一种应用于离线询问的优美暴力算法。它是主要思想是让区间的左端点和右端点移动的距离加起来最短。二、实现假设现在有这样一串序列:\(1,1,4,5,1,4\),我们现在要求询问区间内的\(1\)的出现次数。如果我们现在已经统计到了区间\((2,3)\),现在询问\((1,5)\)。现......
  • 文心一言 VS 讯飞星火 VS chatgpt (100)-- 算法导论9.3 6题
    六、用go语言,对一个包含n个元素的集合来说,k分位数是指能把有序集合分成k个等大小集合的第k-1个顺序统计量。给出一个能找出某一集合的k分位数的O(nlgk)时间的算法。文心一言:要找到一个集合的k分位数,可以使用Go语言编写以下算法:packagemainimport("fmt""sort"......
  • [剑指offer] 其他算法[上]篇
    JZ66构建乘积数组/*暴力*/publicclassJZ66_1{publicstaticint[]multiply(int[]A){int[]res=newint[A.length];Arrays.fill(res,1);for(inti=0;i<A.length;i++){for(intj=0;j<A.len......
  • 快速排序/选择算法
    ......
  • 基础双指针算法:单队列、双队列
    1、单队列输入一串字符串,字符串有多个由单个逗号隔开的单词,任务是需要把单词间隔开,每个单词换行输出。输入样例abcdefghi输出样例abcdefghi#include<iostream>usingnamespacestd;constintN=1010;intmain(){charstr[N];#definegets(str)gets_s(str......
  • 9.25算法
    #include<bits/stdc++.h>usingnamespacestd;structListNode{  intval;  ListNode*next;  ListNode():val(0),next(nullptr){}  ListNode(intx):val(x),next(nullptr){}  ListNode(intx,ListNode*next):val(x),next(next){}};......
  • 轻松掌握冒泡排序算法,值得收藏
    冒泡排序(BubbleSort)是一种简单的排序算法,其基本思想是多次遍历待排序的数组,每次比较相邻的两个元素,如果它们的顺序不正确就交换它们,直到整个数组有序为止。冒泡排序的基本步骤如下:从数组的第一个元素开始,比较相邻的两个元素,如果它们的顺序不正确就交换它们。重复步骤1,直到遍历......
  • 本地测试Spark的逻辑回归算法
    本地小数据量测试了一下Spark的LogisticRegressionWithSGD算法,效果不尽如人意。    数据样例如下,竖杠前的0,1代表两种类型,后面逗号隔开的是两个特征,两个特征只要有一个大于等于0.6就会被分为1这一类,否则就是0。1|0.3,0.60|0.2,0.11|0.5,0.61|0.8,0.30|0.4,0.30|0.3,0.......