【每日刷题】Day128

【每日刷题】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.xdnf.cn/news/147016.html

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

相关文章

Spring在不同类型之间也能相互拷贝?

场景还原 日常开发中&#xff0c;我们会定义非常多的实体&#xff0c;例如VO、DTO等&#xff0c;在涉及实体类的相互转换时&#xff0c;常使用Spring提供的BeanUtils.copyProperties&#xff0c;该类虽好&#xff0c;可不能贪用。 这不在使用过程中就遇到一个大坑&#xff0c…

逻辑分析仪看波形方法

一、串口波形讲解 异步串行数据的一般格式是&#xff1a;起始位数据位停止位&#xff0c;其中起始位1 位&#xff0c;数据位可以是5、6、7、8位&#xff0c;停止位可以是1、1.5、2位。 对于正逻辑的TTL电平&#xff0c; a.起始位是一个值为0的位&#xff0c;低电平&#xff…

leetcode练习 二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3提示&#xff1a; 树中节点的数量在 [0, 104] 区间内。-100 …

【图像检索】基于Gabor特征的图像检索,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Gabor特征的图像检索&#xff0c;用matlab实现。 一、案例背景和算法介绍 这次博…

排序----快速排序(快排)(递归版)

首先讲一下单趟的思路&#xff1a; 在这一块数据中&#xff0c;记录第一个元素为key&#xff0c;然后设置L和R两个指针&#xff0c;L找比key处的元素大的&#xff0c;R找比key处元素小的&#xff0c;找到了就交换这两个位置的元素。当两个指针相遇时&#xff0c;若相遇点的元素…

20240921在友善之臂的NanoPC-T6开发板上确认宸芯的数传模块CX6602N的AT命令

console:/dev # cat ttyUSB1 & console:/dev # echo AT > ttyUSB1 20240921在友善之臂的NanoPC-T6开发板上确认宸芯的数传模块CX6602N的AT命令 2024/9/21 21:03 【必须】Android12/Linux&#xff08;Buildroot&#xff09;都必须要&#xff01; 4、【Android12默认打开U…

https的连接过程

根证书: 内置在操作系统和浏览器中,可手动添加,下级是中间证书或服务器证书,只有当中间证书或服务器证书关联到已存在的根证书时,中间证书或服务器证书才视为有效 中间证书: 位于根证书和服务器证书之间,他们之间也可以没有中间证书,作用是对根证书增加一个下级,方便管理,由根…

GAMES101(作业4~5)

作业四 题目&#xff1a; 由 4 个控制点表示的 Bzier 曲线&#xff0c; bezier&#xff1a;该函数实现绘制 Bzier 曲线的功能。它使用一个控制点序列和一个 OpenCV&#xff1a;&#xff1a;Mat 对象作为输入&#xff0c;没有返回值。它会使 t 在 0 到 1 的范围内进 行迭代&a…

【Linux】进程地址空间和进程调度队列

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

RecyclerView的notifyDataSetChanged和notifyItemRemoved之间的区别

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 RecyclerView 提供了多种方法来通知适配器&#xff08;Adapter&#xff09;数据集发生变化&#xff0c;其中 notifyDataSetChanged() 和 notify…

数据库系统基础概述

文章目录 前言一、数据库基础概念 1.数据库系统的组成2.数据模型3.数据库的体系结构二、MySQL数据库 1.了解MySQL2.MySQL的特性3.MySQL的应用场景总结 前言 MySQL数据库是一款完全免费的产品&#xff0c;用户可以直接从网上下载使用&#xff0c;不用花费任何费用。这点对于初学…

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…

【AcWing】875. 快速幂

#include<iostream> using namespace std; typedef long long LL;LL qmi(int a,int b,int p){LL res1%p;//%p是为了p1的时候&#xff0c;余数是0while(b){if(b&1) resres*a%p;//位数是1的b>>1;aa*(LL)a%p;//a*a再modp是为了防止溢出}return res; }int main(){i…

【动态规划】(三)动态规划——完全背包

动态规划——完全背包 完全背包理论基础零钱兑换Ⅱ组合总和Ⅳ爬楼梯&#xff08;进阶版&#xff09;零钱兑换完全平方数单词拆分背包问题总结 完全背包理论基础 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

零食店小程序发展客户转化运营

零食店、折扣店近些年市场中跑出了不少区域性、多地化的品牌&#xff0c;直营及加盟模式&#xff0c;还有各种超市、商场、街边小店等&#xff0c;零食基本没有年龄群体限制&#xff0c;又属于常消费品&#xff0c;线上线下生意都可以进行发展。 线下客户到店&#xff0c;线上…

链表数据结构

链表可以解决顺序表的缺点 我们今天简单引用下链表 这边是代码讲解 头文件 #pragma once #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> using namespace std; typedef struct student {union {int data;int len;};s…

【计网】从零开始掌握序列化与反序列化 --- 基础知识储备与程序重构

从零开始掌握序列化与反序列化 1 初识序列化与反序列化2 再谈Tcp协议3 程序重构3.1 Socket类3.2 回调函数设计3.3 最终的Tcp服务器类 1 初识序列化与反序列化 在刚学习计算机网络时&#xff0c;我们谈到过网络协议栈&#xff0c;其中最上层的就是应用层&#xff0c;那么这个应…

Rosetta 一:手把手教你用Linux安装Rosetta(全网最简洁)

文章目录 1. Rosetta 介绍2.下载2. Rosetta 安装3. 验证安装 1. Rosetta 介绍 很久很久之前就对Rosetta有所耳闻&#xff0c;有一篇文章叫做denovo protein design&#xff0c;说的就是用rosetta来设计蛋白质。 rosetta是david baker团队设计的软件&#xff0c;早期只是一个蛋…

【Godot4.3】胶囊形的偏移获取法

概述 之前用半圆弧拼接的方式求过胶囊形&#xff0c;在逐渐熟练使用Geometry2D的过程中&#xff0c;发现通过线段求端点是圆角类型的偏移多边形&#xff0c;获得的就是胶囊形。 所以我们有了第二种胶囊形求法。 测试代码 tool extends Node2D## 横向宽度 export var width:…

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…