【每日刷题】Day128

news2024/9/22 7:01:01

【每日刷题】Day128

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 606. 根据二叉树创建字符串 - 力扣(LeetCode)

2. LCR 194. 二叉树的最近公共祖先 - 力扣(LeetCode)

3. LCR 155. 将二叉搜索树转化为排序的双向链表 - 力扣(LeetCode)

1. 606. 根据二叉树创建字符串 - 力扣(LeetCode)

//思路:前序遍历+判断。

//根据题目给的例子我们就能明白本题的要求:将子树用括号括起来,空树用一对空括号"()"表示。如果左子树不为空,右子树为空,则右子树的"()"应当省略;如果左子树为空,右子树不为空,则左子树的"()"不能省略;如果左右子树均为空,也就是叶子节点,则左右子树的"()"都要省略。

class Solution {

public:

    bool IsLeafNode(TreeNode* root)//判断是否为叶子节点

    {

        return !root->left&&!root->right;

    }

    string tree2str(TreeNode* root)

    {

        string ans;

        if(!root) return ans;//遍历到空树,返回空字符串

        if(IsLeafNode(root))//如果是叶子节点,则左右子树的"()"均省略

        {

            ans+=to_string(root->val);

            return ans;

        }

        ans+=to_string(root->val);

        ans+='(';

        ans+=tree2str(root->left);

        ans+=')';


 

        if(root->right) ans+='(';//判断右树是否为空

        ans+=tree2str(root->right);

        if(root->right) ans+=')';

        return ans;

    }

};

2. LCR 194. 二叉树的最近公共祖先 - 力扣(LeetCode)

//思路:找规律+深搜。

//本题有一个非常重要的规律:

class Solution {

public:

    bool IsInTree(TreeNode* f,TreeNode* x)//去当前 f 节点的子树中查找 x 节点

    {

        if(!f) return false;

        if(f==x) return true;

        return IsInTree(f->left,x)||IsInTree(f->right,x);

    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)

    {

        if(!root) return nullptr;

        bool left1 = IsInTree(root->left,p);//去当前节点的左树查找 p 节点

        bool left2 = IsInTree(root->left,q);//去当前节点的左树查找 q 节点

        bool right1 = IsInTree(root->right,p);//去当前节点的右树查找 p 节点

        bool right2 = IsInTree(root->right,q);//去当前节点的左树中查找 q 节点

        if(root==p&&(left2||right2)) return root;//处理公共祖先为 p 的情况

        if(root==q&&(left1||right1)) return root;//处理公共祖先为 q 的情况

        if((left1&&right2)||(left2&&right1)) return root;//左边找到了 p 节点并且右边找到了 q 节点 或者 左边找到了 q 节点并且右边找到了 p 节点。则当前节点就是公共祖先

        TreeNode* ret1 = lowestCommonAncestor(root->left,p,q);

        if(ret1) return ret1;//如果已经找到了,则不需要去右边找,直接返回

        TreeNode* ret2 = lowestCommonAncestor(root->right,p,q);

        return ret2;

    }

};

3. LCR 155. 将二叉搜索树转化为排序的双向链表 - 力扣(LeetCode)

//思路1:中序遍历+存储。

//中序遍历一次二叉搜索树,将中序遍历的结果以节点指针的形式存入数组中。

//随后遍历数组对每一个节点的left和right进行修改操作

class Solution {

public:

    bool IsLeafNode(Node* root)//判断是否为叶子节点

    {

        return !root->left&&!root->right;

    }

    void _treeToDoublyList(Node* root,vector<Node*>& arr)

    {

        if(!root) return;

        _treeToDoublyList(root->left,arr);

        arr.push_back(root);//中序遍历,将节点存入数组中

        _treeToDoublyList(root->right,arr);

    }

    Node* treeToDoublyList(Node* root)

    {

//处理两个边界情况

        if(!root) return nullptr;

        if(IsLeafNode(root))

        {

            root->left = root;

            root->right = root;

            return root;

        }

        vector<Node*> arr;

        _treeToDoublyList(root,arr);

        int size = arr.size();

//处理第一个和最后一个节点

        arr[0]->left = arr[size-1];

        arr[0]->right = arr[1];

        arr[size-1]->right = arr[0];

        arr[size-1]->left = arr[size-2];

        for(int i = 1;i<size-1;i++)

        {

            arr[i]->left = arr[i-1];

            arr[i]->right = arr[i+1];

        }

        return arr[0];

    }

};

//思路2:双指针+中序遍历。

//这里的思路非常巧妙:我们使用两个指针 cur 和 prev。cur初始为root;prev初始为nullptr。进行如下操作:

class Solution {

public:

    void _treeToDoublyList(Node* cur,Node*& prev)//这里 prev 需要传引用,因为要改变实参 prev 的位置

    {

        if(!cur) return;

        _treeToDoublyList(cur->left,prev);

        cur->left = prev;//双指针操作

        if(prev) prev->right = cur;

        prev = cur;

        _treeToDoublyList(cur->right,prev);

    }


 

    Node* treeToDoublyList(Node* root)

    {

        if(!root) return nullptr;

        Node* prev = nullptr;

        _treeToDoublyList(root,prev);

        Node* head = root;//找链表头

        while(head->left) head = head->left;

        head->left = prev;

        prev->right = head;

        return head;

    }

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2154504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TryHackMe 第3天 | Pre Security (中)

该学习路径讲解了网络安全入门的必备技术知识&#xff0c;比如计算机网络、网络协议、Linux命令、Windows设置等内容。上一篇中简短介绍了计算机网络相关的知识&#xff0c;本篇博客将记录 网络协议 部分。 How the web works? DNS in detail DNS (Domain name system&…

【数据结构】排序算法系列——快速排序(附源码+图解)

快速排序 接下来我们将要介绍的是排序中最为重要的算法之一——快速排序。 快速排序&#xff08;英语&#xff1a;Quicksort&#xff09;&#xff0c;又称分区交换排序&#xff08;partition-exchange sort&#xff09;&#xff0c;最早由东尼霍尔提出。快速排序通常明显比其…

XXL-JOB环境搭建

2.快速入门 2.1 下载源码 a.源码下载地址: github地址 gitee地址 2.2.环境搭建&#xff1a; a.初始化调度数据库: 1.请下载项目源码并解压&#xff0c;获取 “调度数据库初始化SQL脚本” 并执行即可 b.编译源码: 1.解压源码,按照maven格式将源码导入IDE, 使用maven进行…

【Python】使用国内镜像安装conda并创建python环境

conda介绍&#xff1a; Conda 是一个开源的包管理系统和环境管理系统&#xff0c;由 Continuum Analytics 开发。它的主要作用是简化科学计算中软件包和依赖的安装和升级&#xff0c;并允许用户轻松地在不同的环境中切换。Conda 的设计初衷是为了简化 Python 环境的搭建和管理&…

海洋大地测量基准与水下导航系列之二国外海底大地测量基准和海底观测网络发展现状(上)

海底大地控制网建设构想最先由美国斯克里普斯海洋研究所(Scripps Institution of Oceanography,SIO)提出&#xff0c;目前仅有少数发达国家具备相应技术条件。美国、日本、俄罗斯和欧盟等发达国家通过布测先进的海底大地控制网&#xff0c;不断完善海洋大地测量基准基础设施&am…

go 运行报错missing go.sum entry for module providing package

运行&#xff1a; #清理go.mod中不再需要的模块&#xff0c;并且会添加缺失的模块条目到go.sum中 go mod tidy

【全网最全】2024华为杯数学建模C题高质量成品查看论文!【附带全套代码+数据】

题 目&#xff1a; ___基于数据驱动下磁性元件的磁芯损耗建模 完整版获取&#xff1a; 点击链接加入群聊【2024华为杯数学建模助攻资料】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kxtS4vwn3gcv8oCYYyrqd0BvFc7tNfhV7&authKeyedQFZne%2BzvEfLEVg2v8FOm%…

线段树优化dp,CF 413E - Maze 2D

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 413E - Maze 2D 二、解题报告 1、思路分析 对于(li, l) -> (ri, r) …

nginx upstream转发连接错误情况研究

本次测试用到3台服务器&#xff1a; 192.168.10.115&#xff1a;转发服务器A 192.168.10.209&#xff1a;upstream下服务器1 192.168.10.210&#xff1a;upstream下服务器2 1台客户端&#xff1a;192.168.10.112 服务器A中nginx主要配置如下&#xff1a; log_format main…

接口加解密及数据加解密

目录 一、 加解密方式介绍 1.1 Hash算法加密 1.2. 对称加密 1.3 非对称加密 二、 我们要讲什么&#xff1f; 三、 接口加解密 四、 数据加解密 一、 加解密方式介绍 所有的加密方式我们可以分为三类&#xff1a;对称加密、非对称加密、Hash算法加密。 算法内部的具体实现…

Mysql高级篇(中)—— SQL优化之查询截取分析

SQL优化之查询截取分析 一、慢查询日志&#xff08;1&#xff09;简述&#xff08;2&#xff09;如何开启&#xff08;3&#xff09;慢查询日志分析工具介绍(了解)&#xff08;4&#xff09;官方工具 mysqldumpslow简述如何使用 二、SHOW PROCESSLIST三、&#xff08;了解&…

网络安全详解

目录 引言 一、网络安全概述 1.1 什么是网络安全 1.2 网络安全的重要性 二、网络安全面临的威胁 2.1 恶意软件&#xff08;Malware&#xff09; 2.2 网络钓鱼&#xff08;Phishing&#xff09; 2.3 中间人攻击&#xff08;Man-in-the-Middle Attack&#xff09; 2.4 拒…

让C#程序在linux环境运行

今晚花一些时间&#xff0c;总结net程序如何在linux环境运行的一些技术路线。 1、采用.Net Core框架 NET Core 使用了 .NET Core Runtime&#xff0c;它可以在 Windows、Linux 和 macOS 等多个操作系统上运行。可以采用Visual Studio生成Linux版本的dll。 在Linux系统中&…

救生圈检测系统源码分享

救生圈检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

Python基础学习(3)

目录 一&#xff0c;函数 1&#xff0c;函数的定义 2&#xff0c;函数的参数 1&#xff0c;默认值 2&#xff0c;传参 3&#xff0c;返回值 4&#xff0c;变量的作用域 5&#xff0c;函数的调用 二&#xff0c;常用数据结构 1&#xff0c;列表 列表的定义 列表的特性…

机器学习的应用领域

机器学习在许多领域有广泛的应用&#xff0c;下面列出了一些主要的应用领域及其典型应用&#xff1a; 1. 图像识别 人脸识别&#xff1a;用于解锁手机、自动标记照片、监控安全系统。物体识别&#xff1a;应用于自动驾驶汽车、机器人、医疗影像分析中&#xff0c;帮助机器理解…

vue3 TagInput 实现

效果 要实现类似于下面这种效果 大致原理 其实是很简单的,我们可以利用 element-plus 组件库里的 el-tag 组件来实现 这里我们可以将其抽离成一个公共的组件,那么现在有一个问题就是通讯问题 这里我们可以利用父子组件之间的通讯,利用 v-model 来实现,父组件传值,子组…

蓝桥杯15届C/C++B组省赛题目

问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 5050 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 77 个人&#xff0c;这 77 人彼此之间没有进行握手 (但这 77 人与…

Unity数据持久化4——2进制

概述 基础知识 各类型数据转字节数据 文件操作相关 文件相关 文件流相关 文件夹相关 练习题 using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine;public class Exercises1 : MonoBehaviour {/…

金融科技与银行业的数字化转型

随着科技的迅猛发展&#xff0c;金融科技已经成为推动银行业数字化转型的重要力量。从移动支付到区块链&#xff0c;再到人工智能&#xff0c;这些新兴技术正逐渐改变银行的运作方式&#xff0c;不断提高银行的服务效率、提升客户体验&#xff0c;并推动整个金融生态系统的变革…