二叉树算法练习day.2

102.二叉树的层序遍历

链接:. - 力扣(LeetCode)

题目描述:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000]
  • -1000 <= Node.val <= 1000

思路:

使用队列来实现,先将当前层的节点存储到队列中,并记录当前层的节点的数量,再根据当前层节点的数量将当前层的元素弹出,因此队列中的元素是在不断变化的,需要根据每一层的节点数量情况来选择弹出的元素

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {//二维数组,用来存放每一层的元素int **res = malloc(sizeof(int *)*2000);//记录层数int k = 0;*returnColumnSizes = malloc(sizeof(int) *2000);//队列,用来保存遍历过的节点struct TreeNode **queue = malloc(sizeof(struct TreeNode *)*2000);int head = 0, tail = 0;*returnSize = 0;if(root == NULL)return res;//根节点不为空,则根节点入队列queue[tail++] = root;//队列不为空while(head != tail){//记录每一层的元素个数int size = tail - head;//存储每一层的元素int *num = malloc(sizeof(int) *size);for(int i = 0; i < size; i++){//队列头元素出队列struct TreeNode *node = queue[head++];num[i] = node->val;//出队列的节点的左右子树不为空,则入队列if(node->left != NULL)queue[tail++] = node->left;if(node->right != NULL)queue[tail++] = node->right;}(*returnColumnSizes)[k] = size;res[k++] = num;}*returnSize = k;return res;
}

226.翻转二叉树

链接:. - 力扣(LeetCode)

题目描述:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100]
  • -100 <= Node.val <= 100

思路:两两交换左右孩子节点的指针

使用递归函数实现

1.先确定函数的参数和返回值,此时函数应该传入的是根节点,返回的应该也是根节点

2.确定递归终止的条件,这里的递归终止条件应该是节点为空

3.函数的处理逻辑,此时是交换节点的左右孩子

如果此时使用前序遍历,那么应该先遍历根节点,再依次访问左右子树

如果使用的是后序遍历,那么应该先遍历左右子树,再访问根节点

前序遍历代码(中左右)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* invertTree(struct TreeNode* root) {//当前节点为空if(!root)return root;//实现节点交换struct TreeNode *node;node = root->left;root->left = root->right;root->right = node;//遍历左右子树invertTree(root->left);invertTree(root->right);return root;
}

后序遍历代码(左右中)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* invertTree(struct TreeNode* root) {if(!root)return root;invertTree(root->left);invertTree(root->right);struct TreeNode *node = root->left;root->left = root->right;root->right = node;return root;
}

注意:上述代码不能用于中序遍历,因此会导致右子树一直没有处理(更改之后又会进行一次更改,导致处理的还是原来的左子树)

中序代码(左右中)

入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。

101.对称二叉树

链接:. - 力扣(LeetCode)

题目描述:

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

思路:

主要判断根节点的左右子树是否相等,而不是判断当前节点的左右子树是否相等

使用后序遍历二叉树,因为我们要将左右孩子的信息进行收集并返回给根节点,这样才能进行判断该二叉树是否能够翻转(对称)

递归函数实现:

1.确定函数的参数和返回值,判断真假返回值应该为bool类型,要比较左右子树,应该传入的参数就为两个结构体类型的指针

2.确定函数终止条件,即函数左空右不空,返回假,右空左不空,返回假,左右都为空,返回真,左右不为空但是值不相等,返回假

3.确定函数处理逻辑,当两个节点都不为空,并且两个节点的值相等,比较左子树的左节点和右子树的右节点以及左子树的右节点和右子树的左节点

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool fuc(struct TreeNode *left , struct TreeNode *right)
{if(left != NULL && right == NULL) //左空右不空return false;else if(left == NULL && right != NULL) //右空左不空return false;else if(left == NULL && right == NULL) //左右都为空return true;else if(left->val != right->val) //左右值不相等return false;//值相等并且比较左子树的左节点和右子树的右节点,已经左子树的右节点和右子树左节点return (left->val == right->val)&&fuc(left->left,right->right)&&fuc(left->right,right->left);}bool isSymmetric(struct TreeNode* root) {if(!root)return true;return fuc(root->left,root->right);    }

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

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

相关文章

AcWing 312. 乌龟棋(每日一题)

原题链接&#xff1a;312. 乌龟棋 - AcWing题库 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘只有一行&#xff0c;该行有 N 个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。 棋盘第 1 格是唯一的起点&#xff0c;第…

AI绘画:实例-利用Stable Diffusion ComfyUI实现多图连接:区域化提示词与条件设置

在Stable Diffusion ComfyUI中&#xff0c;有一种高级技巧可以让用户通过细致的区域化提示词来控制图像的不同部分&#xff0c;从而实现多图连接的效果。这种方法允许艺术家在同一画布上展现多个场景&#xff0c;创造出富有层次和故事性的图像。以下是实现这一效果的详细步骤。…

搜索技术 笔记

1.提高搜索精准度&#xff1a;英文输入法下的双引号 2.ctrlF 3 intitle: 限定标题里含这个东西 4. allintitle:限定标题里含几个关键词 allintitle&#xff1a;赵丽颖 知否 5.intext&#xff1a;限定文章内容的关键词 6.李子柒 inurl:cctv 7.site:cctv.com 完整的域名 …

vue2+elementUi的两个el-date-picker日期组件进行联动

vue2elementUi的两个el-date-picker日期组件进行联动 <template><el-form><el-form-item label"起始日期"><el-date-picker v-model"form.startTime" change"startTimeChange" :picker-options"startTimePickerOption…

python-基础篇-字符串、列表、元祖、字典-列表

文章目录 2.3.2列表2.3.2.1列表介绍2.3.2.1.1列表的格式2.3.2.1.2打印列表 2.3.2.2列表的增删改查2.3.2.2.1列表的遍历2.3.2.2.1.1使用for循环2.3.2.2.1.2使用while循环 2.3.2.2.2添加元素("增"append, extend, insert)2.3.2.2.2.1append 2.3.2.2.2.2extend2.3.2.2.2…

基于Java+SpringBoot+vue3点餐/外卖管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

AWS入门实践-利用S3构建一个静态网站

使用Amazon S3托管静态网站是一个流行的选择&#xff0c;因为它简单、成本效益高&#xff0c;并且易于维护。静态网站由不含服务器端脚本的文件组成&#xff0c;如HTML、CSS和JavaScript文件。下面是使用S3托管静态网站的操作步骤&#xff1a; 如果大家没有AWS免费账号&#x…

12-1-CSS 常用样式属性

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 常用样式属性1 CSS 三角形2 CSS 用户界面样式2.1 什么是界面样式2.2 鼠标…

06-kafka及异步通知文章上下架

kafka及异步通知文章上下架 1)自媒体文章上下架 需求分析 2)kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性msusmsms级以内可用性高&#xff08;主从&#xff09;高&#xff08;主从&#…

App应用的服务器如何增加高并发能力

大家好&#xff01;我是你们的好朋友咕噜铁蛋&#xff01;近年来&#xff0c;随着移动互联网的蓬勃发展&#xff0c;各类App应用如雨后春笋般涌现&#xff0c;用户量呈现爆发式增长。然而&#xff0c;随之而来的高并发访问问题也开始频繁出现&#xff0c;给服务器带来了极大的挑…

vue 加 websocket 聊天

<template><div style="height: 100%; width: 100%; background-color: #fff"><div class="wrap"><!-- 头部 --><div class="titleBox"><imgsrc="@/assets/image/avatar.png"style="argin: 10p…

Oracle的物理结构解析

这些图是我自己画的&#xff0c;我也会在我的公众号【会用数据库】解析。理解起来非常简单&#xff0c;而且非常好记。不用死记硬背&#xff0c;有兴趣可以来公众号看呀。

营销中的归因人工智能

Attribution AI in marketing 归因人工智能作为智能服务的一部分&#xff0c;是一种多渠道算法归因服务&#xff0c;根据特定结果计算客户互动的影响和增量影响。有了归因人工智能&#xff0c;营销人员可以通过了解每个客户互动对客户旅程每个阶段的影响来衡量和优化营销和广告…

ensp华为AC+AP上线配置

AR1配置&#xff1a; <Huawei>system-view # 进入系统视图<Huawei>sysname R1 # 设备重命名[R1]dhcp enable # 开启DHCP功能[R1]interface GigabitEthernet0/0/0 # 进入接口 [R1-GigabitEthernet0/0/0]ip address 192.168.0.1 23 # 配置接口地址 [R1-GigabitE…

苹果cmsV10 MXProV4.5自适应PC手机影视站主题模板苹果cms模板mxone pro

演示站&#xff1a;http://a.88531.cn:8016 MXPro 模板主题(又名&#xff1a;mxonepro)是一款基于苹果 cms程序的一款全新的简洁好看 UI 的影视站模板类似于西瓜视频&#xff0c;不过同对比 MxoneV10 魔改模板来说功能没有那么多,也没有那么大气&#xff0c;但是比较且可视化功…

代码随想录刷题随记14-二叉树3

代码随想录刷题随记14-二叉树3 104.二叉树的最大深度 leetcode 链接 递归 class Solution { public:int sub(TreeNode * root){if(root->leftnullptr&&root->rightnullptr)return 1;int lefthroot->leftnullptr?0:sub(root->left); int righthroot-…

lua学习笔记6(经典问题输出99乘法表)

print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字&#xff0c;用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…

Redis常用命令补充和持久化

一、redis 多数据库常用命令 1.1 多数据库间切换 1.2 多数据库间移动数据 1.3 清除数据库内数据 1.4 设置密码 1.4.1 使用config set requirepass yourpassword命令设置密码 1.4.2 使用config get requirepass命令查看密码 二、redis高可用 2.1 redis 持久化 2.1.1 持…

骨架屏:提升用户体验的巧妙技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

基于tensorflow和kereas的孪生网络推理图片相似性

一、环境搭建 基础环境&#xff1a;cuda 11.2 python3.8.13 linux ubuntu18.04 pip install tensorflow-gpu2.11.0 验证&#xff1a;# 查看tensorflow版本 import tensorflow as tf tf.__version__ # 是否能够成功启动GPU from tensorflow.python.client import device_lib pr…