【代码随想录】刷题Day17

news/2024/7/23 20:30:23 标签: 算法, leetcode, 数据结构

1.AVLTree判断

110. 平衡二叉树

后序遍历的强化理解:

所谓后续遍历,不仅仅是一种遍历,其实它是完成了所有左右子树的递归。后续遍历能将自己所求的值返回给上层节点。这在比较中很关键,举个例子,我们能得到下边节点返回给上面节点的层数,那么就能进行高度的比较。

本题其实也是一样的思路:

1.我想设计一个算法,使得每一个节点的高度,那么后续遍历能完成该任务。是否平衡的比较落在左右节点之差上,最后如果不是AVL树,那我们返回-1。

2.返回值为int型,因为我们需要统计每一层的节点高度;传入的参数为树的节点

3.结束递归依据为root是否走到nullptr,如果根节点为空,此时走到底部,返回给上层为0,因为该位置没有节点

4.我们使用后续遍历,那么对应的定义left变量接收左边的高度,并且如果左边高度为-1,说明此时下面传回的信息是“已经不是平衡二叉树”,那么后续其实已经不需要操作了,那么我们直接返回-1,往上告知该树不是平衡二叉树;对应的定义right变量接收右边的高度,遇到-1的情况与左子树一样处理。

5.最后我们执行中间操作:如果左边-右边的绝对值绝对高度差大于1,说明此时不平衡,直接返回-1;如果不是,那么我们要返回上层的高度,所以我们要比较左右节点高度谁大,将大的值进行加一再返回,加一操作是因为上层节点也是一个高度,所以上层得到自己的高度是下面高度加上自己节点的高度。

class Solution {
public:
    int _isBalancedR(TreeNode* root)
    {
        if(root==nullptr)
            return 0;
        int left = _isBalancedR(root->left);
        if(left==-1)
            return -1;
        int right = _isBalancedR(root->right);
        if(right==-1)
            return -1;
        int ret;
        if(abs(left-right)>1)
            return -1;
        return ret=(left>right)?left+1:right+1;
    }
    bool isBalanced(TreeNode* root) {
        if(_isBalancedR(root)==-1)
            return false;
        return true;
    }
};

2.二叉树的所有路径

257. 二叉树的所有路径

大体思路:我想通过传递string的变量,使得每一层都有不同的string继承上面传来的路径

1.实现该函数传入的参数为:根节点,引用参数vector<string> vs和string s,由于我们只需要对s收获的路径存储到引用vs中,所以不需要进行什么传回操作,因此我们函数返回void

2.返回条件,这题与之前的最小深度思路有点重合:”就是如果一个节点左右有一个节点为空,但是另一个不为空,此时往空节点那里走是不会触发存储条件的!!!这点很重要,是树的减枝操作“;所以我们不仅要判断节点是否为空,还要判断节点的左右节点是否为空。因此返回条件有两种:一、如果当前节点不为空,但是左右节点为空,说明该节点为叶子节点,那么我们需要把这个路径存储下来,再返回  二、如果当前节点为空,此时已经过了条件一的判断,说明这种路径是需要被减枝的,所以直接返回即可

3.我们使用的是前序遍历,因为这样我们才能得到遍历的叶子节点数据,那操作很简单:就是将root的val存储到s中,随后左右遍历

4.s中存储数据需要注意,如果是中间操作,那么我们要加上题目要求的”->“标记,如果在叶子节点,那么说明此时不需要加”->“标记

class Solution {
public:
    void _GetTreePathR(TreeNode* root,vector<string>& vs,string s)
    {
        if(root&&root->left==nullptr&&root->right==nullptr)
        {
            s+=(to_string(root->val));
            vs.push_back(s);
            return;
        }
        if(root==nullptr)
            return;
        s+=(to_string(root->val)+"->");
        _GetTreePathR(root->left,vs,s);
        _GetTreePathR(root->right,vs,s);
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> vs;
        string s;
        _GetTreePathR(root,vs,s);
        return vs;
    }
};

这种通过string临时遍历保存每一层的操作确实简单,但是它浪费空间啊,每一层都保存一个string,要是节点多,爆内存是迟早的事情。所以优化的目标就是把string也变成引用参数,这样我们开辟的就只有一个string了。不过此时对应的就是要把sting往上返回时,减去一些数据。

无非就是用一个tmp存储,在走到vs存储后,将s剪掉后面的数据;当一层遍历结束,返回上层时,把对应的数据删除

class Solution {
public:
    void _GetTreePathR(TreeNode* root,vector<string>& vs,string& s)
    {
        if(root&&root->left==nullptr&&root->right==nullptr)
        {
            string tmp = to_string(root->val);
            s+=(tmp);
            vs.push_back(s);
            s.erase(s.end()-tmp.size(),s.end());
            return;
        }
        if(root==nullptr)
            return;
        string tmp = to_string(root->val)+"->";
        s+=(tmp);
        _GetTreePathR(root->left,vs,s);
        _GetTreePathR(root->right,vs,s);
        s.erase(s.end()-tmp.size(),s.end());
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> vs;
        string s;
        _GetTreePathR(root,vs,s);
        return vs;
    }
};

3.左叶子之和

404. 左叶子之和

这道题所说的左叶子特征:

1.该节点没有左右节点

2.该节点为父节点的左节点

所以描述成代码就是:当前位置不为空,当前位置的左节点不为空,当前位置的左节点没有子节点

class Solution {
public:
    void _GetSumR(TreeNode* root,int& sum)
    {
        if(root&&root->left&&!(root->left->left)&&!(root->left->right))
            sum+=root->left->val;
        if(root==nullptr)
            return;
        _GetSumR(root->left,sum);
        _GetSumR(root->right,sum);
    }
    int sumOfLeftLeaves(TreeNode* root) {
        int sum = 0;
        _GetSumR(root,sum);
        return sum;
    }
};

http://www.niftyadmin.cn/n/296330.html

相关文章

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

快速上手Pytorch实现BERT&#xff0c;以及BERT后接CNN/LSTM 本项目采用HuggingFace提供的工具实现BERT模型案例&#xff0c;并在BERT后接CNN、LSTM等 HuggingFace官网 一、实现BERT&#xff08;后接线性层&#xff09; 1.引用案例源码&#xff1a; from transformers impo…

如何成为一名数仓工程师?

如何成为一名数仓工程师&#xff1f; 成为一名数据仓库工程师需要具备以下几个关键技能和知识&#xff1a; 数据库技术&#xff1a;数据仓库是一个数据库系统&#xff0c;因此需要具备扎实的数据库基础知识和数据库编程技能&#xff0c;包括SQL语言、数据库设计和优化等方面的…

JAVA10新特性

JAVA10新特性 概述 2018年3月21日, Oracle官方宣布JAVA10正式发布 JAVA9和java10 都不是 LTS (Long-Term-Support)版本.和过去的JAVA大版本升级不同,这两个只有半年左右的开发和维护时间. 而JAVA11 也是就是18.9,才是JAVA之后的第一个长期支持版本 JAVA10 一共定义了109个新特…

SpringBoot整合Echarts实现用户人数和性别展示

一、背景 在Web应用开发中&#xff0c;经常需要使用图表来展示数据&#xff0c;而Echarts是一个非常优秀的图表库。SpringBoot是一个非常流行的Java Web框架&#xff0c;它可以快速搭建Web应用。本文将介绍如何使用SpringBoot集成Echarts&#xff0c;实现展示用户人数和性别的…

力扣刷题Day12_2

144.二叉树的前序遍历 测试代码main() class TreeNode:def __init__(self, valNone, leftNone, rightNone):self.val valself.left leftself.right rightfrom typing import Listclass Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:s Solution…

IBMMQ 下载地址 -- 安装

https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/ 这里给出IBM MQ在CentOS上安装的详细步骤&#xff1a; 1. 首先&#xff0c;下载IBM MQ软件包。你需要到IBM网站上注册并且登录&#xff0c;然后下载IBM MQ的安装包。需要下载的文件有两个&…

Vben Admin 自学记录 —— Modal弹窗组件的基本使用及练习(持续更新中...)

Modal 弹窗 对 antv 的 modal 组件进行封装&#xff0c;扩展拖拽&#xff0c;全屏&#xff0c;自适应高度等功能。 Modal相关使用及概念 练习 —— 在之前table基础上&#xff0c;添加编辑功能&#xff0c;点击编辑按钮&#xff0c;弹出弹窗显示单条表格数据&#xff0c;数据…

css3 flex弹性布局详解

css3 flex弹性布局详解 一、flexbox弹性盒子 2009年&#xff0c;W3C 提出了一种新的方案----Flex 布局&#xff0c;可以简便、完整、响应式地实现各种页面布局。目前&#xff0c;它已经得到了所有浏览器的支持&#xff0c;这意味着&#xff0c;现在就能很安全地使用这项功能。…