首页 > 编程语言 >算法练习-day18

算法练习-day18

时间:2023-07-17 22:31:59浏览次数:47  
标签:root1 return val day18 练习 算法 二叉树 root 节点

二叉树

654. 最大二叉树

题意:给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树 。

示例:

算法练习-day18_二叉树

       思路:本题的大致思路和之前做过的中序遍历和后序遍历得出二叉树非常类似。本题,我们只需要找到一个数组的最大元素作为根节点即可,然后以最大元素作为分界点,分割出左右子树的数组元素,继续按照上述方式找到最大元素作为根节点循环进行,直到所有数组中的元素都被使用完即可

C++代码:

    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if(0==nums.size())//当传入的数组为空时,表示该树为空树或者该节点到头了
        {
            return nullptr;
        }
        int maxsignal=0;//标记一棵树的根节点在数组中的位置
        for(int i=0;i<nums.size();i++)//找到该位置
        {
            if(nums[maxsignal]<nums[i])
            {
                maxsignal=i;
            }
        }
        TreeNode* root=new TreeNode(nums[maxsignal]);//变为节点
        vector<int> leftnums(nums.begin(),nums.begin()+maxsignal);//将左右子树分离
        vector<int> rightnums(nums.begin()+maxsignal+1,nums.end());
        root->left=constructMaximumBinaryTree(leftnums);
        root->right=constructMaximumBinaryTree(rightnums);
        return root;
    }

617. 合并二叉树

题意:给你两棵二叉树: root1 和 root2 。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始

示例:

算法练习-day18_二叉树_02

思路:本题可以将节点的结合分成四种思路:

  1. 两节点都为空
  2. 两节点都不为空
  3. 左节点不为空,但是右节点为空
  4. 左节点为空,但是右节点不为空

在分类书写时,两节点都为空的情况可以写到后面两种分类中;然后再进行结合,以root1作为基准树,在root1的基础上进行节点结合,先判断后两种情况,此时也会捎带对第一种情况进行排除,最后就是都不为空的情况,直接在root1值的基础上加上root2的值即可

C++代码:

    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(nullptr==root1)//总共有四种情况,我们可以分为三种:左为空,输出右节点
        {
            return root2;
        }
        if(nullptr==root2)//右为空,输出左节点
        {
            return root1;
        }
        root1->val+=root2->val;//都不为空,就加到左节点上
        root1->left=mergeTrees(root1->left,root2->left);//左右节点需要一起递归
        root1->right=mergeTrees(root1->right,root2->right);
        return root1;
    }

700. 二叉搜索树中的搜索

题意:给定二叉搜索树(BST)的根节点 root 和一个整数值 val。

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

示例:

算法练习-day18_二叉树_03

思路:本题我的思路大致是:由于是搜索二叉树,所以树的特点是:

  1. 左边的值都比根节点小,右边的值都比根节点大
  2. 所有左子树和右子树自身必须也是二叉搜索树

因此我们需要先比较根节点,当根节点大时,说明val大概率在左子树中,root向左子树移动;当根节点小时,说明val大概率在右子树,root向右子树移动;当根节点等于val时,返回root

C++代码:

    TreeNode* searchBST(TreeNode* root, int val) {
        if(nullptr==root)//当找到叶子节点还没找到val时,返回nullptr
        {
            return nullptr;
        }
        if(root!=nullptr&&root->val>val)//比较根节点,不断缩小范围
        {
            root=searchBST(root->left,val);
        }
        if(root!=nullptr&&root->val<val)
        {
            root=searchBST(root->right,val);
        }
        return root;
    }

98. 验证二叉搜索树

题意:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:

  1. 节点的左子树只包含 小于 当前节点的数。
  2. 节点的右子树只包含 大于 当前节点的数。
  3. 所有左子树和右子树自身必须也二叉搜索树。

示例:

算法练习-day18_二叉树_04

思路:本题有两种思路:1.数组法:根据BST的特点我们可以得出中序遍历的节点会形成一个递增的元素,因此我们用中序遍历将节点值记录在数组中,然后判断数组是否严格递增,若是,则该树为BST。2.递归法:利用中序遍历,我们要满足两个条件即可证明该树为BST:

  1. 该树的遍历的前一个节点值都小于后一个值
  2. 该树的左子树和右子树都是BST

因此我们使用中序遍历不断比较前一个节点和后一个节点的值满足第一个条件,然后在最后输出时,再次判断左右子树均是BST即可证明整棵树是BST

数组整理法代码:

    void TrueBST(TreeNode* root,vector<int>& arr)//中序遍历,并存储遍历的节点
    {
        if(nullptr==root)
        {
            return ;
        }
        TrueBST(root->left,arr);
        arr.push_back(root->val);
        TrueBST(root->right,arr);
    }
    bool isValidBST(TreeNode* root) {
        vector<int> arr;
        TrueBST(root,arr);//整理出二叉树中节点的中序遍历
        for(int i=0;i<arr.size()-1;i++)//数组必须满足严格递增的趋势才能为真
        {
            if(arr[i]>=arr[i+1])
            {
                return false;
            }
        }
        return true;
    }

递归法代码:

    long long cur=LONG_MIN;//这里需要注意,有个示例是INT_MIN,因此我们不能使用INT_MIN作为我们的起始值,因此要更小的LONG_MIN作为起始值
    bool isValidBST(TreeNode* root) {
        if(nullptr==root)
        {
            return true;
        }
        bool left=isValidBST(root->left);//从下往上判断只要有一个false,那该节点之上的所有树判断都是false
        if(cur<root->val)
        {
            cur=root->val;
        }
        else
        {
            return false;
        }
        bool right=isValidBST(root->right);
        return left&&right;//最后在判断根节点的左右子树都为搜索二叉树
    }

标签:root1,return,val,day18,练习,算法,二叉树,root,节点
From: https://blog.51cto.com/u_15209404/6754484

相关文章

  • 第一篇博客 练习typora笔记
    学习MarkDown字体helloworld!helloworld!helloworld!helloworld! 引用 乐交诤友不交损友 分割线 图片  超链接点击跳转到百度 列表ABC 无序列表ABC 列表姓名性別年齡張三男18 代碼publicvoid......
  • RLChina2022公开课-博弈搜索算法
    序列决策序列决策问题一般用马尔可夫决策模型进行描述搜索算法的优化......
  • RLChina2022-实践课三:强化学习算法
    MDP算法MDP被定义为一个元组(S,A,P,r,R)S:所有状态集合A:在环境力里面智能体所作动作的集合P:状态转移函数P(s'|s,a),智能体在当前s下,执行a之后,转移到是s'的概率R:奖励函数R(s,a),表示在环境s下执行动作a之后获得的立即奖励,有时候还需要知道s'是多少才能共同决定奖励是多少。......
  • 数值修约算法
    1、Java版本点击查看代码importcom.github.pagehelper.util.StringUtil;importstaticcn.hutool.core.convert.Convert.toStr;importstaticorg.springframework.util.ObjectUtils.isEmpty;/***数值、精度、修约规则*<pre>*实例代码:*......
  • 算法_贝叶斯网络学习_bayesian networks
    基本概念条件概率联合概率边缘概率链式法则随机变量的独立性条件独立性贝叶斯规则、贝叶斯概率推理和贝叶斯网络模型。stochastic,主要用作形容词,主要意思为“随机的;猜测的”R语言包R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析lme4广义线性混合模型......
  • 拓扑排序算法相关的知识点总结
    拓扑排序算法相关的知识点总结拓扑排序算法是一种对有向无环图(DAG)进行排序的方法,它可以将图中的所有顶点排成一个线性序列,使得对于任意一对顶点u和v,如果存在一条从u到v的有向边,那么u在序列中必然出现在v之前。拓扑排序算法可以用来解决一些依赖关系的问题,例如课程安排、工程进度......
  • java原地算法
    原地算法:优化内存空间的Java编程技巧随着计算机科学的发展,我们不断追求更高效的算法和更低的内存消耗。在Java编程中,原地算法是一种常见的优化技巧,它可以大大减少对内存的使用,提高程序的性能。本文将介绍什么是原地算法,为什么要使用它以及如何在Java中实现。什么是原地算法?原地......
  • 代码随想录算法训练营第三十二天| 343. 整数拆分 96.不同的二叉搜索树
     343.整数拆分要求:将一个正数拆分成N个正整数,使得这N个正整数的乘机是最大的思路:DP数组:dp[n]N的时候,它的乘机最大值注意:不是i*dp[n-i]就是最大值,因为如果用dp就证明要开始拆分了,如果我不拆分,就是用的这两个数的话,那么就是单纯的i*(n-i)代码:1//要求:将N拆分成K......
  • 文心一言 VS 讯飞星火 VS chatgpt (60)-- 算法导论6.4 4题
    文心一言VS讯飞星火VSchatgpt(60)--算法导论6.44题四、证明:在最坏情况下,HEAPSORT的时间复杂度是Ω(nlgn)。文心一言:要证明在最坏情况下,HEAPSORT的时间复杂度是Ω(nlogn),我们需要考虑在何种情况下堆排序的时间复杂度最低。在堆排序中,构建最大堆的时间复杂度为O(n),......
  • m基于FPGA的带相位偏差64QAM调制信号相位估计和补偿算法verilog实现,包含testbench
    1.算法仿真效果 本系统进行了Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:   将FPGA的仿真结果导入到matlab中,显示星座图,结果如下所示:    2.算法涉及理论知识概要         在现代通信系统中,调制技术是实现高速数据传输和频谱效率优化的......