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

算法练习-day13

时间:2023-06-24 15:31:37浏览次数:47  
标签:return 练习 算法 targetSum day13 二叉树 root 节点 postorder

二叉树

112. 路径总和

题意:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。

示例:

算法练习-day13_二叉树

      思路:本题的思路,我们先排除空树的情况,然后让我们的目标数统一减去根节点的值,之后确定我们递归函数的返回值,我们需要使用bool类型的返回值来返回该路线是否等于targetSum,如果相等,我们返回true,否则就返回false,继续寻找下一条路线;然后对于每条线路值得处理,我们使用模拟回溯的方法,对该路径的目标值进行减的操作

C++代码:

bool CountNode(TreeNode* root,int targetSum)
    {
        if(nullptr==root->left&&nullptr==root->right)//到叶子节点的情况,判断是否该路径等于targetSum
        {
           if(targetSum==0)
           {
               return true;
           }
           return false;
        }
        if(root->left)//模拟实现回溯算法
        {
            targetSum-=root->left->val;
            if(CountNode(root->left,targetSum))
            {
                return true;
            }
            targetSum+=root->left->val;
        }
        if(root->right)
        {
            targetSum-=root->right->val;
            if(CountNode(root->right,targetSum))
            {
                return true;
            }
            targetSum+=root->right->val;
        }
        return false;
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(nullptr==root)//排除空树情况
        {
            return false;
        }
        return CountNode(root,targetSum-root->val);//先删除头节点元素,因为每条路线必须删除头节点
    }

513. 找树左下角的值

题意:给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。

示例:

算法练习-day13_二叉树_02

思路:我们先要确定返回值需要满足的条件

  1. 最底层,最深
  2. 最左侧

因此,我们最终的结果可能不是最左侧的,但一定是最深的,因此我们需要定义两个全局变量,一个是现在最左侧的节点值,另一个就是现在最深高度,我们需要满足以上两点,才能输出该值;其次就是模拟回溯算法,保证depth为最深

C++代码:

    int Num=0;
    int MaxDep=INT_MIN;
    void DepthNode(TreeNode* root,int depth)
    {
        if(nullptr==root->left&&nullptr==root->right)
        {
            if(depth>MaxDep)//我们返回的Num必须是最深且最左侧是节点值
            {
                MaxDep=depth;
                Num=root->val;
            }
            return;
        }
        if(root->left)//模拟回溯算法
        {
            depth++;
            DepthNode(root->left,depth);
            depth--;
        }
        if(root->right)
        {
            depth++;
            DepthNode(root->right,depth);
            depth--;
        }
    }
    int findBottomLeftValue(TreeNode* root) {
        DepthNode(root,1);
        return Num;
    }

106. 从中序与后序遍历序列构造二叉树

题意:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

示例:

算法练习-day13_二叉树_03

       思路:本题我们可以根据中序遍历数组和后序遍历数组的特点来构建二叉树,首先,后序遍历数组的最后一个元素就是一棵树的根节点,我们就以一棵树的根节点建立二叉树,其次中序遍历可以分割以root为根节点的左右子树节点,我们通过后序遍历,不断分割中序遍历数组

C++代码:

    TreeNode* CreateTree(vector<int>& inorder,vector<int>& postorder)
    {
        if(postorder.size()==0)
        {
            return nullptr;
        }
        int midval=postorder[postorder.size()-1];
        TreeNode* root=new TreeNode(midval);
        int mid=0;
        for(;mid<inorder.size();mid++){//找到中序遍历的中间节点,分离二叉树
            if(inorder[mid]==midval)
            {
                break;
            }
        }
        vector<int> leftinorder(inorder.begin(),inorder.begin()+mid);//切割中序遍历
        vector<int> rightinorder(inorder.begin()+mid+1,inorder.end());
        postorder.resize(postorder.size()-1);//后序遍历的最后一个元素不要,已经作为根节点加入二叉树了
        //切割后序遍历
        vector<int> leftpostorder(postorder.begin(),postorder.begin()+leftinorder.size());
        vector<int> rightpostorder(postorder.begin()+leftinorder.size(),postorder.end());

        root->left=CreateTree(leftinorder,leftpostorder);//左二叉树连接
        root->right=CreateTree(rightinorder,rightpostorder);//右二叉树连接
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        return CreateTree(inorder,postorder);
    }

标签:return,练习,算法,targetSum,day13,二叉树,root,节点,postorder
From: https://blog.51cto.com/u_15209404/6541217

相关文章

  • 实时渲染前沿研究:在浏览器上实现了Facebook提出的DLSS算法
    大家好,我基于WebNN在浏览器上实现了2020年Facebook提出的Neural-Supersampling-for-Real-time-Rendering算法。它是一个用于实时渲染的神经网络超采样算法,能够把低分辨率的图片超采样为高分辨率的图片本课程系列文章可进入合集查看:实时渲染前沿研究系列文章合集介绍DLSS算法整......
  • [算法学习笔记] Tarjan LCA
    在讲解之前,我们先来看一道模板题:LuoguP3379最近公共祖先(LCA)WhatisLCALCA,即最近公共祖先。什么意思呢,我们举个例子:将就着看吧qwq这棵树中,0为根节点。若规定\(LCA(x,y)\)为\(x,y\)的最近公共祖先,则\(LCA(5,6)=2;LCA(4,3)=1;LCA(5,3)=0\)。还有很多,这里不一一列举了。最......
  • 代码随想录算法训练营第十六天| 找树左下角的值 路径总和 从中序与后序遍历序列
    找树左下角的值1,层序遍历,较为简单:1intfindBottomLeftValue_simple(TreeNode*root){2intresult=0;3if(!root)returnresult;4queue<TreeNode*>selected;5selected.push(root);67while(!selected.empty())8{9......
  • sql练习-1
    --创建表--CREATETABLE`course`(--`cid`int(3)NOTNULLAUTO_INCREMENTCOMMENT'课程编号',--`cname`varchar(10)DEFAULTNULLCOMMENT'课程名',--`tid`int(3)DEFAULTNULLCOMMENT'教师编号',--PRIMARYKEY(`cid`))--ENGINE=InnoD......
  • 快速排序算法
    快速排序(QuickSort)是一种常用的排序算法,它的时间复杂度为O(nlogn),是一种效率比较高的排序算法。但是快速排序不是稳定的排序算法。稳定排序算法是指,如果排序前两个元素相对顺序相同,那么排序后它们的相对顺序仍然相同。而快速排序并不保证相同元素的顺序不发生改变,所以它不是稳......
  • 21.动态规划算法
    人工智能时代,各国都在大力研究机器人技术,也制造出各种各样的机器人,比如:为了解决男女失衡而制造的美女机器人,假如你参与了某美女机器人的研发,你在这个项目中要求实现一个统计算法:如果美女机器人一次可以上1级台阶,也可以一次上2级台阶。求美女机器人走一个n级台阶总共有多少种走法。......
  • sql练习-2
    2023-6-19sql语句----以下题目涉及到的表有--ecs_users(用户表)、--ecs_order_info(订单表)、--ecs_goods(商品表)、--ecs_goods_type(商品类型表)--usetest;select*fromecs_users;select*fromecs_goods;select*fromecs_order_info;select*fromecs_order_......
  • LLE算法在自然语言生成中的应用:实现文本到语音的情感迁移
    目录自然语言生成(NaturalLanguageGeneration,NLP)是人工智能领域的一个分支,它利用大量的文本数据训练出语言模型,从而实现对自然语言的生成和理解。在NLP中,情感迁移(EmotionTransfer)是一个重要的任务,它可以通过对已有文本的情感分析,将其转化为语音,从而实现文本到语音的情感迁......
  • 文心一言 VS 讯飞星火 VS chatgpt (45)-- 算法导论6.1 3题
    三、证明:在最大堆的任一子树中,该子树所包含的最大元素在该子树的根结点上。文心一言:在最大堆中,根结点是整个堆中最大元素的孩子,因此它包含的最大元素是在该子树的根结点上。我们可以通过递归的方式证明任意子树中的最大元素都在该子树的根结点上。假设我们已经证明了深度为d-......
  • Scala练习
    wordCountpackagecom.doit.day03importscala.io.{BufferedSource,Source}objectWordCountDemo{defmain(args:Array[String]):Unit={//读取文件,获取到一个Source对象valsource:BufferedSource=Source.fromFile("D:\\develop\\ideaWorkSpace\\......