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

算法练习-day14

时间:2023-06-24 23:02:12浏览次数:55  
标签:tmp 叶子 练习 day14 算法 二叉树 root 节点 left

二叉树

110. 平衡二叉树

题意:给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1

示例:

算法练习-day14_平衡二叉树

       思路:本题我们可以自下而上判断二叉树是否为平衡二叉树,以上图为示例,我们先判断15是不是平衡二叉树,很明显是的,此时就引出了我们递归的终止条件,当root为空时,此时返回0;再判断20节点,发现高度差为0,符合条件,此时的高度变为1+子二叉树的最大高度,此时为2,以此往上判断;而当高度差大于-1时,这时我们就会有新的判断条件,只要有一个子树为-1,那么之后的所有子树都为-1,这样我们在返回主函数判断时,判断的依据也自然就是返回的值是否等于-1

C++代码:

int intDepth(TreeNode* root)
    {
        if(nullptr==root)//当为空节点时,返回0(即叶子节点之后的节点没有高度)
        {
            return 0;
        }
        int leftHeigh=intDepth(root->left);
        if(leftHeigh==-1)//当有一个节点高度为-1时,就说明该二叉树已经不是平衡二叉树了,所以之后的节点都会继承-1,最后返回给根节点
        {
            return -1;
        }
        int rightHeigh=intDepth(root->right);
        if(rightHeigh==-1)
        {
            return -1;
        }
        int result=rightHeigh-leftHeigh;
        if(result<-1||result>1)//当两高度已经不满足条件时,直接返回-1
        {
            result =-1;
        }
        else//两高度差还满足条件,此时根节点高度为1+最大高度
        {
            result=max(leftHeigh,rightHeigh)+1;
        }
        return result;
    }
    bool isBalanced(TreeNode* root) {
        return intDepth(root)==-1?false:true;
    }

257. 二叉树的所有路径

题意:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。

示例:

算法练习-day14_二叉树_02

       思路:本题的思路就是使用前序遍历和回溯的方法,先将我们看到的节点加入到给定的数组中,用于记录路径的节点,然后再通过返回条件,让数组中元素以->的方式加入arr中,最后在返回到上一步,找是否有不同路径需要保存

C++代码:

vector<string> arr;
    void Allpath(TreeNode* root,vector<int>& tmp)
    {
        tmp.push_back(root->val);//前序遍历写法
        if(nullptr==root->left&&nullptr==root->right)//走到一个路径的末尾了
        {
            string s;
            for(int i=0;i<tmp.size()-1;i++)//将前n-1个节点加入,中间需要到->符号
            {
                s+=to_string(tmp[i]);
                s+="->";
            }
            s+=to_string(tmp[tmp.size()-1]);//单独添加最后一个节点
            arr.push_back(s);
        }
        if(root->left)//模拟回溯函数,先增加节点,然后删除节点
        {
            Allpath(root->left,tmp);
        }
        if(root->right)
        {
            Allpath(root->right,tmp);
        }
        tmp.pop_back();
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> tmp;
        Allpath(root,tmp);
        return arr;
    }

404. 左叶子之和

题意:给定二叉树的根节点 root ,返回所有左叶子之和。

示例:

算法练习-day14_平衡二叉树_03

       思路:本题我们需要考虑的是,什么是左叶子?即叶子节点的上一个节点的左孩子,就是左叶子。因此,我们需要使用中序便利的方法,找到左叶子,然后再根据左叶子的判断条件进行相加即可

C++代码:

int sum=0;
    void CountLeft(TreeNode* root)
    {
        if(root->left)//中序遍历写法,我们永远需要的都是左叶子节点,包括右子树,也是左叶子节点
        {
            CountLeft(root->left);
        }
        if(root->left!=nullptr&&root->left->left==nullptr&&root->left->right==nullptr)//判断是否为左叶子
        {
            sum+=root->left->val;
        }
        if(root->right)
        {
            CountLeft(root->right);
        }
    }
    int sumOfLeftLeaves(TreeNode* root) {
        CountLeft(root);
        return sum;
    }

标签:tmp,叶子,练习,day14,算法,二叉树,root,节点,left
From: https://blog.51cto.com/u_15209404/6542157

相关文章

  • 算法设计与分析
    记得在课本上标注...只是t某根据ppt的臆测而已...1.算法复杂度分析五大渐近符号常见渐近函数关系常用求和公式2.递归、分治策略写递归式根据递归式求复杂度:迭代画递归树主定理法:(就是代公式)3.堆、堆排序、二叉搜索树堆操作及复杂度扩展堆4.排序算法ppt无5.......
  • 图的一些算法设计题
    1.设计一个算法,求无向连通图中距离顶点V最远的顶点。假设图G采用邻接表的存储结构,利用广度优先搜索遍历算法,从V出发进行广度优先搜索,最后一层的顶点距离V最远。遍历时利用队列暂存各个顶点,队列中的最后一个顶点一定在最后一层,因此只要将该顶点作为结果即可。intmaxdis(ALGraph*G,......
  • vulnhub靶机练习:01-Empire-Lupin-One
    这次用的是OracleVMVirtualBox,避免用vmware出现的问题靶机地址:https://www.vulnhub.com/entry/empire-lupinone,750/arp-scan-l  扫描ip kali:172.88.6.144靶场:172.88.6.63/1、扫描ipnmap-A-sV-T4-p-172.88.6.63 1.1尝试访问ip 1.2目录扫描    d......
  • Scala练习题
    SQLjoin语法案例Data:order.txtorder011,u001,300order012,u002,200order023,u006,100order056,u007,300order066,u003,500order055,u004,300order021,u005,300order014,u001,100order025,u005,300order046,u007,30order067,u003,340order098,u008,310user.txt......
  • 数据结构与算法
    目录时间复杂度递归的时间复杂度计算时间复杂度递归的时间复杂度计算T(n)=aT(n/b)+f(n)......
  • 文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题
    四、假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于哪里?文心一言:最大堆的最小元素位于堆的根结点。由于最大堆的性质,根结点是堆中所有元素的最大值,因此它也是堆中所有元素的最小值。讯飞星火:假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于根节点。因......
  • 文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题
    四、假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于哪里?文心一言:最大堆的最小元素位于堆的根结点。由于最大堆的性质,根结点是堆中所有元素的最大值,因此它也是堆中所有元素的最小值。讯飞星火:假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于根节......
  • 算法练习-day13
    二叉树112.路径总和题意:给你二叉树的根节点 root和一个表示目标和的整数 targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 targetSum。如果存在,返回true;否则,返回false。叶子节点是指没有子节点的节点。示例:   思路:本......
  • 实时渲染前沿研究:在浏览器上实现了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\)。还有很多,这里不一一列举了。最......