【代码随想录】【算法训练营】【第15天】 [102]二叉树的层序遍历 [226]翻转二叉树 [101]对称二叉树

news2024/12/22 18:40:12

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 15,一周中最困难的周三~

题目详情

[102] 二叉树的层序遍历

题目描述

102 二叉树的层序遍历
102 二叉树的层序遍历

解题思路

前提:二叉树的层级遍历
思路:利用队列的“先进先出”特性,层级遍历二叉树。
重点:利用队列的“先进先出”特性,层级遍历二叉树。

代码实现

C语言
/**
 * 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) {
    //输出结果初始化
    *returnSize = 0;

    // 空结点
    if (root == NULL)
    {
        return NULL;
    }
    
    int **ret = NULL;
    struct TreeNode *queue[2000];
    int idx = 0;
    int start = 0;
    queue[idx++] = root;
    while (start < idx)
    {
        // 动态分配输出数组大小
        (*returnSize)++;
        ret = (int **)realloc(ret, sizeof(int *) * (*returnSize));
        *returnColumnSizes = (int *)realloc(*returnColumnSizes, sizeof(int) * (*returnSize));
        (*returnColumnSizes)[(*returnSize) - 1] = idx - start;
        ret[(*returnSize) - 1] = (int *)malloc(sizeof(int) * ((*returnColumnSizes)[(*returnSize) - 1]));
        // 输出该层结点
        for (int i = 0; i < (*returnColumnSizes)[(*returnSize) - 1]; i++)
        {
            struct TreeNode *cur = queue[start++];
            // 左结点压栈
            if (cur->left)
            {
                queue[idx++] = cur->left;
            }
            // 右结点压栈
            if (cur->right)
            {
                queue[idx++] = cur->right;
            }
            // 输出该结点
            ret[(*returnSize) - 1][i] = cur->val;
        }
    }
    return ret;
}

[226] 翻转二叉树

题目描述

226 翻转二叉树
226 翻转二叉树

解题思路

前提:翻转二叉树,左右子树结点位置交换
思路:从上到下,左右子树位置交换,可以采用先序或者后序遍历。
重点:无法使用中序遍历,中序遍历会使二叉树反转两次,变成原二叉树。

代码实现

C语言
先序遍历 递归
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
void reversalTree(struct TreeNode *root)
{
    if (root == NULL)
    {
        return ;
    }
    // 左右结点反转
    struct TreeNode *tmp = root->left;
    root->left = root->right;
    root->right = tmp;
    reversalTree(root->left);
    reversalTree(root->right);
    return ;
}

struct TreeNode* invertTree(struct TreeNode* root) {
    reversalTree(root);
    return root;
}
先序遍历 迭代
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* invertTree(struct TreeNode* root) {
    struct TreeNode *stack[100];
    int idx = 0;
    if (root != NULL)
    {
        stack[idx++] = root;
    }
    while (idx > 0)
    {
        
        struct TreeNode *cur = stack[--idx];
        // 左右结点非空入栈
        if (cur->left)
        {
            stack[idx++] = cur->left;
        }
        if (cur->right)
        {
            stack[idx++] = cur->right;
        }
        // 交换左右结点
        struct TreeNode *tmp = cur->left;
        cur->left = cur->right;
        cur->right = tmp;
    }
    return root;
}

[101] 对称二叉树

题目描述

101 对称二叉树
101 对称二叉树

解题思路

前提:二叉树左右子树镜像对称
思路:先序遍历、层级遍历均可以实现。
重点:判断结点相等的位置要明确。

代码实现

C语言
先序遍历 递归
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

bool isSymmetricFound(struct TreeNode* left, struct TreeNode* right)
{
    if ((left == NULL) && (right == NULL))
    {
        return true;
    }
    else if (((left != NULL) && (right == NULL)) || ((left == NULL) && (right != NULL)))
    {
        return false;
    }
    else if (left->val != right->val)
    {
        return false;
    }
    // 递归
    bool ans = false;
    ans = isSymmetricFound(left->left, right->right);
    if (ans != true)
    {
        return false;
    }
    return isSymmetricFound(left->right, right->left);
}

bool isSymmetric(struct TreeNode* root) {
    // 判断空树
    if (root == NULL)
    {
        return true;
    }
    return isSymmetricFound(root->left, root->right);
}
先序遍历 迭代
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSymmetric(struct TreeNode* root) {
    // 判断空树
    if (root == NULL)
    {
        return true;
    }
    // 使用栈(队列同样的处理流程)
    struct TreeNode *stack[1000];
    int idx = 0;
    // left right成对入栈,即使为null
    stack[idx++] = root->right;
    stack[idx++] = root->left;
    while (idx)
    {
        struct TreeNode *left = stack[--idx];
        struct TreeNode *right = stack[--idx];
        if ((left == NULL) && (right == NULL))
        {
            continue;
        }
        else if (((left != NULL) && (right == NULL)) || ((left == NULL) && (right != NULL)))
        {
            return false;
        }
        else if (left->val != right->val)
        {
            return false;
        }
        // 此时左右结点均为非空,将该左右结点的子节点 成对 入栈
        stack[idx++] = right->right;
        stack[idx++] = left->left;
        stack[idx++] = left->right;
        stack[idx++] = right->left;
    }
    return true;
}
层级遍历

同先序遍历 迭代,只是将stack换为 queue,实现流程一致。

今日收获

  1. 二叉树的遍历,递归及迭代的实现。

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

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

相关文章

C#利用WinForm实现可以查看指定目录文件下所有图片

目录 一、关于Winform 二、创建应用 三、功能实现 四、代码部分 一、关于Winform Windows 窗体是用于生成 Windows 桌面应用的 UI 框架。 它提供了一种基于 Visual Studio 中提供的可视化设计器创建桌面应用的高效方法。 利用视觉对象控件的拖放放置等功能&#xff0c;可…

信捷PLC 编程常用寄存器及编程技巧说明

最近在用信捷的PLC&#xff0c;分享下常用的寄存器和编程技巧说明。 技巧主要包括以下几个方面&#xff1a; 充分规划各个功能区&#xff1a;在编写程序时&#xff0c;需要充分规划各个功能区。 考虑伺服步进功能和气缸手动功能的应用&#xff0c;手动操作时&#xff0c;可…

C语言 | Leetcode C语言题解之第107题二叉树的层序遍历II

题目&#xff1a; 题解&#xff1a; int** levelOrderBottom(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {int** levelOrder malloc(sizeof(int*) * 2001);*returnColumnSizes malloc(sizeof(int) * 2001);*returnSize 0;if (!root) {return level…

个人感觉对Material设计有用的几个网址

(一) Modular and customizable Material Design UI components for Android GIthub: material-components-android (二) 学习Material设计 Material Design (三) 用于创建Material主题&#xff0c;支持导出多种格式 material-theme-builder

Web API——获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标&#xff1a;能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法&#xff1a; document.querySelector(css选择…

一维前缀和[模版]

题目链接 题目: 分析: 因为要求数组中连续区间的和, 可以使用前缀和算法注意:下标是从1开始算起的, 真正下标0的位置是0第一步: 预处理出来一个前缀和数组dp dp[i] 表示: 表示[1,i] 区间所有元素的和dp[i] dp[i-1] arr[i]例如示例一中: dp数组为{1,3,7}第二步: 使用前缀数…

css特性(继承性、层叠性)

1.继承性 可以继承的常见属性&#xff08;文字控制属性都可以继承&#xff09; ps:可以通过调试器查看是否能够继承 注意&#xff1a;a标签的color会继承失效&#xff1b;h系列标签的font-size会继承失效 2.层叠性 后面的样式会覆盖前面的样式 给同一个标签设置不同的样式…

酷开科技以内容为契机,酷开系统向消费者需求的深度挖掘迈进一步

酷开系统还拥有强大的内容资源和推荐算法&#xff0c;能够根据消费者的兴趣爱好为其提供个性化的推荐服务。无论是电影、电视剧、综艺节目&#xff0c;还是新闻、体育、娱乐资讯&#xff0c;酷开系统都能帮助大家快速找到感兴趣的内容&#xff0c;并且通过智能推荐算法不断优化…

vue3插槽solt 使用

背景增加组件的复用性&#xff0c;个人体验组件化还是react 方便。 Vue插槽solt如何传递具名插槽的数据给子组件&#xff1f; 一、solt 原理 知其然知其所以然 Vue的插槽&#xff08;slots&#xff09;是一种分发内容的机制&#xff0c;允许你在组件模板中定义可插入的内容…

4月粽子行业线上市场销售数据分析

随着节日庆祝常态化&#xff0c;消费者对礼物消费的态度发生变化&#xff0c;这会影响粽子的消费模式和市场需求。再加上技术进步&#xff0c;如速冻粽子和真空粽子的推广&#xff0c;也极大地推动了粽子行业的发展&#xff0c;使得产品更易于保存和运输&#xff0c;从而满足了…

Spark-RDD-持久化详解

Spark概述 Spark-RDD概述 1.持久化与序列化的关系 在Spark中&#xff0c;持久化&#xff08;Persistence&#xff09;和序列化&#xff08;Serialization&#xff09;是两个关键概念&#xff0c;它们在RDD处理过程中起着重要作用&#xff0c;并且有一定的关联&#xff1a; &a…

Windows安装mingw32/w64

1.下载 MinGW-w64 WinLibs - GCCMinGW-w64 compiler for Windows Releases niXman/mingw-builds-binaries (github.com) MinGW-w64、UCRT 和 MSVCRT 是 Windows 平台上常用的 C/C 运行库&#xff0c;它们有以下不同点&#xff1a; MinGW-w64&#xff1a;是一个基于 GCC 的…

Transformer,革命性的深度学习架构

Transformer 是一种革命性的深度学习架构,专门设计用于处理序列数据,特别是在自然语言处理(NLP)任务中表现卓越。它由 Vaswani 等人在 2017 年发表的论文《Attention is All You Need》中首次提出,打破了当时基于循环神经网络(RNN)和卷积神经网络(CNN)的序列建模常规,…

Golang | Leetcode Golang题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; func sortedArrayToBST(nums []int) *TreeNode {rand.Seed(time.Now().UnixNano())return helper(nums, 0, len(nums) - 1) }func helper(nums []int, left, right int) *TreeNode {if left > right {return nil}// 选择任意一个中间位置…

基于Vue的图片文件上传与压缩组件的设计与实现

摘要 随着前端技术的发展&#xff0c;系统开发的复杂度不断提升&#xff0c;传统开发方式将整个系统做成整块应用&#xff0c;导致修改和维护成本高昂。组件化开发作为一种解决方案&#xff0c;能够实现单独开发、单独维护&#xff0c;并能灵活组合组件&#xff0c;从而提升开…

Leetcode861. 翻转矩阵后的得分

Every day a Leetcode 题目来源&#xff1a;861. 翻转矩阵后的得分 解法1&#xff1a;贪心 对于二进制数来说&#xff0c;我们只要保证最高位是1&#xff0c;就可以保证这个数是最大的&#xff0c;因为移动操作会使得它取反&#xff0c;因此我们进行行变化的时候只需要考虑首…

【Android安全】AOSP版本对应编号| AOSP版本适配Pixel或Nexus型号 | 驱动脚本下载地址

AOSP版本对应编号 https://source.android.com/docs/setup/about/build-numbers?hlzh-cn#source-code-tags-and-builds 例如android-8.1.0_r1 对应的编号是OPM1.171019.011 可以适配Pixel 2 XL AOSP驱动脚本下载 编译AOSP时&#xff0c;需要Google的驱动&#xff0c;后面才…

C++——类与对象(下)

​ 【本节内容】 目录 1. 再谈构造函数 2. static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合…

HTML用法介绍

文章目录 一、HTML概念和模版二、常用标签及用法1.p标签2.span标签3.h标签4.hr标签5.img标签6.a标签7.input标签8.table标签 一、HTML概念和模版 HTML的全称为超文本标记语言&#xff0c;它包括一系列标签组成&#xff0c;模版及各部分注释如下&#xff1a; <!--声明文档类…

从需求角度介绍PasteSpider(K8S平替部署工具适合于任何开发语言)

你是否被K8S的强大而吸引&#xff0c;我相信一部分人是被那复杂的配置和各种专业知识而劝退&#xff0c;应该还有一部分人是因为K8S太吃资源而放手&#xff01; 这里介绍一款平替工具PasteSpider&#xff0c;PasteSpider是一款使用c#编写的linux容器部署工具(使用PasteSpider和…