二叉树--基础OJ

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.hqwc.cn/news/267552.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专栏十五:omicverse在单细胞分析中的实际使用体验和小改动

写一些自己的理解吧,一些小步骤,正在更新中。。。 安装 原作者写的很清楚了 大部分直接抄 个别地方:去选择下载适合自己的pytorch版本PyTorch, 比如我的是cuda12,下载命令实际是 pip3 install torch torchvision torchaudio 查看cuda版本命令 nvidia-smi 当然还有个命…

04-Nacos中负载均衡规则的配置

负载均衡规则 同集群优先 默认的ZoneAvoidanceRule实现并不能根据同集群优先的规则来实现负载均衡,Nacos中提供了一个实现叫NacosRule可以优先从同集群中挑选服务实例 当服务消费者在本地集群找不到服务提供者时也会去其他集群中寻找,但此时会在服务消费者的控制台报警告 第…

BMP转PNG工具BMP2PNG

自己写的一个BMP转PNG工具BMP2PNG 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用&#xff0c; 但是COCOS2DX不支持BMP 如果直接将BMP转换到PNG的话&#xff0c;网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗&#xff1f;要累死 所以写了这个工具。一些古…

《昆虫记》带我进入了一个昆虫的新世界。

《昆虫记》带我进入了一个昆虫的新世界。 《昆虫记》的作者是法国作家亨利.法布尔&#xff0c;他是法国著名的文学家&#xff0c;昆虫学家&#xff0c;科普作家。被世人称为“科学界的诗人”&#xff0c;“昆虫世界的荷马”&#xff0c;“昆虫世界的维吉尔”&#xff0c;他从小…

I2C 应用编程

1. I2C 框架结构 1.1 I2C 硬件框架 I2C 总线拓扑图 ⚫ 在一个芯片 (SoC) 内部&#xff0c;有一个或多个 I2C 控制器 ⚫ 在一个 I2C 控制器上&#xff0c;可以连接一个或多个 I2C 设备 ⚫ I2C 总线只需要 2 条线&#xff1a;时钟线 SCL 、数据线 SDA ⚫ 在 …

SpringCloud面试题——Sentinel

一&#xff1a;什么是Sentinel&#xff1f; Sentinel是一个面向分布式架构的轻量级服务保护框架&#xff0c;实现服务降级、服务熔断、服务限流等功能 二&#xff1a;什么是服务降级&#xff1f; 比如当某个服务繁忙,不能让客户端的请求一直等待,应该立刻返回给客户端一个备…

C# 图解教程 第5版 —— 第18章 泛型

文章目录 18.1 什么是泛型18.2 C# 中的泛型18.3 泛型类18.3.1 声明泛型类18.3.2 创建构造类型18.3.3 创建变量和实例18.3.4 使用泛型的示例18.3.5 比较泛型和非泛型栈 18.4 类型参数的约束18.4.1 Where 子句18.4.2 约束类型和次序 18.5 泛型方法18.5.1 声明泛型方法18.5.2 调用…

Flutter实现自定义二级列表

在Flutter开发中&#xff0c;其实系统已经给我们提供了一个可靠的二级列表展开的API&#xff08;ExpansionPanelList&#xff09;&#xff0c;我们先看系统的二级列表展开效果&#xff0c;一次只能展开一个&#xff0c;用ExpansionPanelList.radio实现 由此可见&#xff0c;已经…

算法Day29 打印数目

打印数目 Description 小硕有一套字母表arr&#xff0c;其中每个上都刻有一个字母arr[i]。返回小硕可以印出的非空字母序列的数目。 注意&#xff1a;本题中&#xff0c;每个字母只能使用一次。 Input 输入字符串arr 1≤arr.length≤7 Output 输出可打印数目 Sample 代码 imp…

血的教训,BigDecimal踩过的坑

很多人都用过Java的BigDecimal类型&#xff0c;但是很多人都用错了。如果使用不当&#xff0c;可能会造成非常致命的线上问题&#xff0c;因为这涉及到金额等数据的计算精度。 首先说一下&#xff0c;一般对于不需要特别高精度的计算&#xff0c;我们使用double或float类型就可…

docker-compose的介绍与使用

一、docker-compose 常用命令和指令 1. 概要 默认的模板文件是 docker-compose.yml&#xff0c;其中定义的每个服务可以通过 image 指令指定镜像或 build 指令&#xff08;需要 Dockerfile&#xff09;来自动构建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中设置…

7 Linux 内核移植

一、编译 ST 的 Linux 系统 1. 压缩源码 首先先下载 ST 官方源码&#xff0c;之前章节已经下载过了&#xff0c;直接输入以下命令&#xff1a; cd linux/atk-mpl/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0/ 然…