二叉树算法练习day.2

news2025/1/20 14:54:46

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.coloradmin.cn/o/1571770.html

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

相关文章

Peter算法小课堂—树状数组

大家好&#xff0c;我是人见人爱&#xff0c;花见花开&#xff0c;车见车爆胎的树状数组Peter Pan&#xff0c;hhh 讲正文前&#xff0c;先来一个长文警告⚠很重要的知识点&#xff1a;L SB&#xff08;SB&#xff1f;&#xff09; LSB 怎么算呢&#xff1f; 哦……懂了&…

班级事务管理系统设计与实现(论文+源码)_kaic

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对班级事务信息管理的提升&#…

在flutter中添加video_player【视频播放插件】

添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中&#xff0c;video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器&#xff0c;并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…

Linux| Awk 中“next”命令奇用

简介 本文[1]介绍了在Linux中使用Awk的next命令来跳过剩余的模式和表达式&#xff0c;读取下一行输入的方法。 next命令 在 Awk 系列教程中&#xff0c;本文要讲解如何使用 next 命令。这个命令能让 Awk 跳过所有你已经设置的其他模式和表达式&#xff0c;直接读取下一行数据。…

LeetCode-54. 螺旋矩阵【数组 矩阵 模拟】

LeetCode-54. 螺旋矩阵【数组 矩阵 模拟】 题目描述&#xff1a;解题思路一&#xff1a;定义上下左右四个边界&#xff0c;进行模拟。解题思路二&#xff1a;5行 Python zip函数图一乐解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xf…

005 文本属性 字体属性

文章目录 文本属性text-decoration(重要)text-transformtext-indenttext-align(重要)letter-spacing、word-spacing 字体属性font-size(重要)font-family(重要)font-weight(重要)font-stylefont-variantline-height(常用)font 文本属性 text-decoration(重要) 用于设置文字的…

Redis主从集群-主从复制(通俗易懂)

为什么要搭建主从集群&#xff1f; 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;可以搭建主从集群&#xff0c;实现读写分离。一般都是一主多从&#xff0c;主节点负责写数据&#xff0c;从节点负责读数据&#xff0c;主节点写入数据…

python画带阴影折线图

&#xff08;1&#xff09; # codinggbk import matplotlib.pyplot as plt import numpy as np# 创建一些示例数据 x np.linspace(-3, 3, 60) y_mean np.sin(x) y_std np.sin(x)# 画折线图 b-:蓝色实线 plt.plot(x, y_mean, b-, labelMean)# 填充阴影表示标准差 alpha…

mysql中主键索引和联合索引的原理解析

mysql中主键索引和联合索引的原理解析 一、主键索引二、什么是联合索引? 对应的B树是如何生成的?1、建立索引方式2、什么是最左前缀原则?3、回表4、为什么要遵守最左前缀原则才能利用到索引?5、什么是覆盖索引?6、索引扫描底层原理7、order by为什么会导致索引消失&#x…

java -网络编程socket-聊天室-02

完整版代码 java -聊天室的代码: 用于存放聊天室的项目的代码和思路导图https://gitee.com/to-uphold-justice-for-others/java---code-for-chat-rooms.git 先引入线程的正统解释 线程&#xff08;Thread&#xff09;是程序执行流的最小单元。线程是操作系统分配CPU时间片的基…

(2024,超分辨率,膨胀卷积和低通滤波,SD)FouriScale:免训练高分辨率图像合成的频率视角

FouriScale: A Frequency Perspective on Training-Free High-Resolution Image Synthesis 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 2.2 通过扩散模型进行…

DotNetBar的SlidePanel和metroTilePanel使用笔记

一、前言 界面组件DotNetBar2中的2个控件属性SlidePanel和metroTitlePanel的使用方法&#xff0c;网上相关资源较少&#xff0c;就一些属性的使用学习记录如下&#xff1a; SlideSideDevComponents.DotNetBar.Controls.eSlideSide.Top/Bottom/Right/Left 及 metroTilePanel和m…

蓝桥杯每日一题:公约数(gcd)

题目描述&#xff1a; 给定两个正整数 a 和 b。 你需要回答 q 个询问。 每个询问给定两个整数 l,r&#xff0c;你需要找到最大的整数 x&#xff0c;满足&#xff1a; x 是 a和 b 的公约数。l≤x≤r。 输入格式 第一行包含两个整数 a,b。 第二行包含一个整数 q。 接下来…

Python人工智能应用---中文分词词频统计

目录 1.中文分词 2.循环分别处理列表 &#xff08;1&#xff09;分析 &#xff08;2&#xff09;代码解决 3.词袋模型的构建 &#xff08;1&#xff09;分析需求 &#xff08;2&#xff09;处理分析 1.先实现字符串的连接 2.字符串放到新的列表里面 4.提取高频词语 &…

WordPress建站教程:10步快速搭建个人网站

WordPress是一个广泛使用的内容管理系统&#xff08;CMS&#xff09;&#xff0c;凭借其用户友好的界面和大量可定制的主题和插件&#xff0c;为WordPress 提供了多功能性和灵活性&#xff0c;可用于创建各种类型的网站&#xff0c;包括个人博客、B2B企业网站、B2C外贸网站等&a…

【HTML】CSS样式(二)

上一篇我们学习了CSS基本样式和选择器&#xff0c;相信大家对于样式的使用有了初步认知。 本篇我们继续来学习CSS中的扩展选择器及CSS继承性&#xff0c;如何使用这些扩展选择器更好的帮助我们美化页面。 下一篇我们将会学习CSS中常用的属性。 喜欢的 【点赞】【关注】【收藏】…

非关系型数据库(缓存数据库)redis的性能管理

目录 一.Redis性能管理 1.Info Memory——查看Redis内存使用 2.内存碎片率 3. 内存使用率 4.内存回收key 二.缓存的穿透&#xff0c;击穿和雪崩 1.缓存的穿透 1.1 问题描述 1.2 缓存穿透发生的条件 1.3 缓存穿透发生的原因 1.4 解决方案 2 缓存的击穿 2.1 问题描…

Redis各个方面入门详解

目录 一、Redis介绍 二、分布式缓存常见的技术选型方案 三、Redis 和 Memcached 的区别和共同点 四、缓存数据的处理流程 五、Redis作为缓存的好处 六、Redis 常见数据结构以及使用场景 七、Redis单线程模型 八、Redis 给缓存数据设置过期时间 九、Redis判断数据过期的…

isc-dhcp-server DNS配置

我遇到一个有趣的问题&#xff0c;我先在一台Ubuntu服务器上使用isc-dhcp-server在其其中一个网口运行DHCP服务&#xff0c;然后我自己的笔记本电脑直连到这个网口&#xff0c;来上网。 本来直接就应该能上网&#xff0c;但是我的电脑只有在打开Clash时才能访问互联网&#xf…

基于多模态单细胞数据构建共表达网络-MuSeGNN

本篇来自于MuSe-GNN: Learning Unified Gene Representation From Multimodal Biological Graph Data的补充材料。主要目的是从多模态数据中构建共表达网络。作者概述了使用CS-CORE&#xff0c;scTransform和SPARK-X进行预处理步骤和网络构建的算法细节。 目前存在大量用于图谱…