二叉树--基础OJ

news2025/1/4 8:01:12

1.对称二叉树

题目链接:101. 对称二叉树 - 力扣(LeetCode)

题解:

我们可以用递归的方法去做:

        如果两个树互为镜像(1.根节点的值相同,2.左子树的值与右子树的值对称)则为对称二叉树,我们先判断左右两棵树根节点的值,如果根节点的值相同,然后判断左右两棵树是否对称(左边树的左孩子是否等于右边树的右孩子,左边树的右孩子是否等于右边树的左孩子)我们依次递归,如果左右子树每个节点都满足以上两个条件,则为对称二叉树。

注意:需要对空进行判断,如果两边对称位置都出现空则不影响结果,如果两边对称位置一边为空,另一边非空,则不为对称二叉树

代码:

bool is(struct TreeNode* root1,struct TreeNode* root2)
{
    if(root1==NULL&&root2==NULL)
        return true;
    if(root1==NULL||root2==NULL)
        return false;
    if(root1->val != root2->val)
        return false;
    return is(root1->left,root2-> right)&&
           is(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root) {
    
    return is(root->left,root->right);
}


2.翻转二叉树 

题目链接:226. 翻转二叉树 - 力扣(LeetCode)

题解:

        这一题其实就是上一题的变形,我们可以看到,翻转之后的图像和原来的图像是对称的关系,因此我们只需要和上一题一样,使用递归的操作依次对每个节点进行操作,我们需要让左右两颗子树的对称位置节点的值进行交换,这样就能变成原图像的对称图像。

代码:

void _invertTree(struct TreeNode* root){
    if(root){
        struct TreeNode* tmp = root->left;
        root->left = root->right;
        root->right = tmp;
        _invertTree(root->left);
        _invertTree(root->right);
    }
}

struct TreeNode* invertTree(struct TreeNode* root){
    _invertTree(root);
    return root;
}


3.平衡二叉树

题目链接:110. 平衡二叉树 - 力扣(LeetCode)

题解:

        首先要保证当前树的左右子树高度差不大于1,而且子树本身也是平衡树。

        这一题依然可以用递归的方法,分别检查左右子树,判断左右子树是否为平衡树,然后检查总体的。因此我们要分别求出左右子树的高度,判断两颗子树的高度差是否小于1(这里可以用到绝对值,左右子树都要进行这样的判断,因此递归条件可以写为:

fabs(TreeHeight(root->left)-TreeHeight(root->right))<=1&&isBalanced(root->left)&&isBalanced(root->right)

代码:

 int TreeHeight(struct TreeNode* root)
{
	if (root == NULL)
		return 0;

	return fmax(TreeHeight(root->left), TreeHeight(root->right)) + 1;
}
bool isBalanced(struct TreeNode* root) {
    if(root==NULL)
        return true;
    return fabs(TreeHeight(root->left)-TreeHeight(root->right))<=1&&isBalanced(root->left)&&isBalanced(root->right);
}


 4.二叉树的前序遍历

题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)

题解:

        要返回二叉树的前序遍历,那么我们使用二叉树前序遍历访问一个节点,就可以使用数组保存一个节点的值,我们通过题目接口可以看到,还要返回size,所有我们还要求二叉树节点的size。

代码:

void pre(struct TreeNode*root,int*a,int*i)
{
    if(root==NULL)
        return;
    a[(*i)++]=root->val;
    pre(root->left,a,i);
    pre(root->right,a,i);
}
int size(struct TreeNode*root)
{
    if(root==NULL)
    {
        return 0;
    }
    return size(root->left)+size(root->right)+1;
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int n = size(root);
    *returnSize =n;
    int*a=(int*)realloc(a,sizeof(int)*n);
    int i=0;
    pre(root,a,&i);
    return a;
}

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

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

相关文章

win中查看MD5、Linux中查看MD5

win中的MD5计算 1、用GitBash Git Bash Here md5sum.exe 我记得-孙燕姿.mp32、win自带命令 certutil -hashfile 我记得-孙燕姿.mp3 MD5Linux中MD5计算 md5sum 我记得-孙燕姿.mp3

使用paddleocr识别图片文本的一种方案

pdf文本分为两种&#xff0c;一种是标准的pdf格式的文本&#xff0c;这种无需利用ocr识别&#xff0c;另外一种就是图片文本&#xff0c;这种需要进行ocr的识别。 OCR 识别文本和文本区域 ppstructure是paddleocr里面的一个子库&#xff0c;可以识别文档的页眉页脚、正文、标…

多线程 - 学习笔记

前置知识 什么是线程和进程? 进程: 是程序的一次执行,一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff0c;比如在Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。 线程: 进程中的一个执行流&#xff0…

我的软考拿证之路

我的软考拿证之路 前言2021年上半年2022年下半年2023年上半年2023年下半年 前言 在2020年8月份&#xff0c;准备参加软考高级项目管理师考试&#xff0c;经历了疫情三年&#xff0c;停考3次&#xff0c;经历了教材更新&#xff0c;经历了考试形式由纸考换机考&#xff0c;共参…

实现TensorBoard可视化网络的参数

前言 最近在做神经网络相关的实验&#xff0c;为了方便神经网络参数是否变化&#xff0c;学习一下TensorBoard可视化网络的参数的方法&#xff0c;这里使用pytorch实现。 实现 当使用PyTorch训练一个简单的神经网络时&#xff0c;可以使用TensorBoardX来可视化网络的参数。以…

机器学习---KNN最近邻算法

1、KNN最近邻算法 K最近邻(k-Nearest Neighbor&#xff0c;KNN)分类算法&#xff0c;是一个理论上比较成熟的方法&#xff0c;也是最简单的机器学习算法之一&#xff0c;有监督算法。该方法的思路是&#xff1a;如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个…

小米耳机定制音效选项灰色无法开启使用_开启定制音效_音效模式设置

使用环境&#xff1a;Redmi K50 Ultra &#xff0b;MIUI 14.0.11&#xff0b;定制音效选项是灰色的无法开启及音效模式无法选择 定制音效无法开启 音效模式无法选择&#xff08;需下载小米耳机APP才能设置&#xff09;&#xff0c;根据提示解决问题即可 解决方法&#xff1a;关…

ICC2:low power与pg strategy(pg_mesh)

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 用pg_strategy创建power stripe,示例如下: set pd_list {{DEFAULT_VA VDD_DIG VDD_DIG VSS} {PD_DSP VDD_DIG VDD_DSP VSS} } ;#两个电源域,DEFAULT_VA和PD_DSP是对应voltage area名字,其中D…

硬件开发笔记(十六):RK3568底板电路mipi摄像头接口原理图分析、mipi摄像头详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134922307 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

【神行百里】pandas查询加速之行索引篇

最近进行大数据处理的时候&#xff0c;发现我以前常用的pandas查询方法太慢了&#xff0c;太慢了&#xff0c;真是太慢了&#xff0c;查阅资料&#xff0c;遂发现了一种新的加速方法&#xff0c;能助力我飞上天&#xff0c;和太阳肩并肩&#xff0c;所以记录下来。 1. 场景说明…

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月&#xff0c;Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾&#xff0c;在 NEARCON2023 的多链网络主题沙龙中发言&#xff1a;我们依然处于区…

Emacs之Plantuml用于复杂UML类图(Markdown用于简单类图)(一百三十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

FTP、U盘等传统数据安全摆渡方法的6个弊端

数据安全摆渡&#xff0c;即数据在不同的网络之间&#xff0c;进行安全流转。做网间隔离的初衷&#xff0c;就是为了保护数据安全&#xff0c;但是在数据摆渡时&#xff0c;除了安全&#xff0c;企业还是需要考虑其他的要素&#xff0c;比如可靠性、易用性、兼容性等等。而传统…

解决:TypeError: write() argument must be str, not Tag

解决&#xff1a;TypeError: write() argument must be str, not Tag 文章目录 解决&#xff1a;TypeError: write() argument must be str, not Tag背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错&#xf…

Qt搭建MQTT编程环境

QT 部署官方MQTT模块 在Qt Creator中&#xff0c;默认是没有部署Mqtt模块的&#xff0c;在使用QT编程之前&#xff0c;先把mqtt 模块部署到开发环境当中。参考博文&#xff1a;Qt开发技术&#xff1a;mqtt介绍、QtMqtt编译和开发环境搭建_长沙红胖子-CSDN博客 下载 Qt官方在g…

HTML 块级元素与行内元素有哪些以及注意、总结

行内元素和块级元素是HTML中的两种元素类型&#xff0c;它们在页面中的显示方式和行为有所不同。 块级元素&#xff08;Block-level Elements&#xff09;&#xff1a; 常见的块级元素有div、p、h1-h6、ul、ol、li、table、form等。 块级元素会独占一行&#xff0c;即使没有…

WPF仿网易云搭建笔记(4):信息流控制之消息订阅

文章目录 专栏和Gitee仓库前言消息订阅最简单的案例简单用例父组件订阅子组件回调 结果 消息订阅机制消息token是A还是B?传递消息的载体。双重token重复订阅问题 结论 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 上一篇文章中&#xff0c;我们简单…

最大公因数,最小公倍数详解

前言 对于初学编程的小伙伴们肯定经常遇见此类问题&#xff0c;而且为之头疼&#xff0c;今天我来给大家分享一下&#xff0c;最大公因数和最小公倍数的求法。让我们开始吧&#xff01; 文章目录 1&#xff0c;最大公因数法1法2法3 2&#xff0c;最小公倍数3&#xff0c;尾声 …

修改 vCenter Server 的 FQDN | hostname | PNID

目录 1 先决条件2. 修改 VC 7.0.3 hostname&#xff08;1&#xff09;备份 VCSA&#xff08;2&#xff09;为VCSA的新hostname创建DNS记录&#xff08;3&#xff09;修改 VCSA 的hostname① 进入vCenter Server VAMI② 查看当前 FQDN③ 编辑网络设置④ 选择网络适配器⑤ 修改 h…

【Linux】 线程池

线程池 什么是线程池&#xff1f; 一次预先申请一批线程&#xff0c;让这批线程有任务&#xff0c;就处理任务&#xff1b;没任务&#xff0c;就处于等待状态。 为什么要有线程池&#xff1f; 以空间换时间&#xff0c;预先申请一批线程&#xff0c;当有任务到来&#xff0c;可…