学习记录:js算法(四十三):翻转二叉树

news2024/9/24 0:22:54

文章目录

    • 翻转二叉树
      • 我的思路
      • 网上思路
        • 递归
    • 总结

翻转二叉树

给你一棵二叉树的根节点 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 = []
输出:[]

我的思路
循环
网上思路
递归、栈

我的思路

var invertTree = function (root) {
    if (!root) return null;
    const queue = [root];
    while (queue.length > 0) {
        const current = queue.shift();
        [current.left, current.right] = [current.right, current.left];
        if (current.left) queue.push(current.left);
        if (current.right) queue.push(current.right);
    }
    return root;
};

讲解

  1. 首先检查根节点是否为空,如果为空,直接返回 null
  2. 使用一个数组 nodes 来存储待处理的节点,初始化时将根节点放入数组。
  3. 使用 for 循环遍历数组中的节点:
    • 取出当前节点 current
    • 交换当前节点的左右子树。
    • 如果当前节点的左子节点不为空,将其加入数组;如果右子节点不为空,也加入数组。
  4. 当所有节点处理完毕后,返回翻转后的根节点。

网上思路

递归
var invertTree = function (root) {
    if (!root) return null; // 如果树为空,直接返回 null

    // 递归翻转左右子树
    const left = invertTree(root.left);
    const right = invertTree(root.right);

    // 交换左右子树
    root.left = right;
    root.right = left;

    return root; // 返回翻转后的根节点
}

讲解

  1. 基线条件:首先检查当前节点 root 是否为空。如果是,直接返回 null
  2. 递归调用:
    • 使用 invertTree(root.left) 递归翻转左子树,并将结果存储在 left 变量中。
    • 使用 invertTree(root.right) 递归翻转右子树,并将结果存储在 right 变量中。
  3. 交换左右子树:将当前节点的左子树设置为 right,右子树设置为 left
  4. 返回根节点:返回当前节点 root,以便在更高层的递归中继续处理。
var invertTree = function (root) {
   if (!root) return null; // 如果树为空,直接返回 null

    const stack = [root]; // 使用栈来存储节点

    while (stack.length > 0) {
        const current = stack.pop(); // 取出栈顶的节点

        // 交换当前节点的左右子树
        [current.left, current.right] = [current.right, current.left];

        // 将非空的左右子节点加入栈
        if (current.left) stack.push(current.left);
        if (current.right) stack.push(current.right);
    }

    return root; // 返回翻转后的根节点
}

详解

  1. 基线条件:首先检查根节点 root 是否为空。如果是,直接返回 null。
  2. 栈初始化:使用一个数组 stack 来模拟栈,初始化时将根节点放入栈。
  3. 循环处理:
    • 当栈不为空时,弹出栈顶节点 current
    • 交换当前节点的左右子树。
    • 如果当前节点的左子节点不为空,将其压入栈;如果右子节点不为空,也压入栈。
  4. 返回根节点:返回当前节点 root,即翻转后的树的根节点。

总结

解法挺多的,但是核心是一样的

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

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

相关文章

大模型价格战,打到了负毛利,卷or不卷?

国产大模型淘汰赛在加速。这轮淘汰赛会持续一两年,只有少数真正具备实力的基础模型企业能继续活下去 中国市场的大模型价格战已经打了近半年。这轮价格战已经打到了负毛利,而且暂时没有停止迹象。头部云厂商仍在酝酿新一轮降价。这轮降价会在今年9月下旬…

视频单目标跟踪研究

由于对视频单目标跟踪并不是很熟悉,所以首先得对该领域有个大致的了解。 视频目标跟踪是计算机视觉领域重要的基础性研究问题之一,是指在视频序列第一帧指定目标 后,在后续帧持续跟踪目标,即利用边界框(通常用矩形框表…

printf 命令:格式化输出

一、命令简介 ​printf​ 命令在 Linux 系统中用于格式化并打印字符串到标准输出。它是 C 语言中 printf ​函数的命令行版本,因此其格式化选项与 C 语言中的非常相似。 相关命令: echo:通常使用 echo,它比较简单。printf&…

你们用过微信CRM管理系统吗?

微信CRM管理系统是近年来流行的管理软件,在市场上得到了很高的认可。许多企业正在应用微信CRM管理系统,那系统具体有些什么功能呢? 1、聚合聊天,可以管理多个微信号 2、批量多号自动加好友任务,设置好时间间隔以及加人…

《论软件系统架构风格》写作框架,软考高级系统架构设计师

论文真题 系统架构风格(System Architecture Style)是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一个词汇表和一组约束,词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起…

李沐对大模型趋势的几点判断,小模型爆发了!

李沐是上海交通大学 2011 届计算机科学与工程系本硕系友。他曾担任亚马逊资深首席科学家,加州大学伯克利分校和斯坦福大学的访问助理教授,是前 Marianas Labs 联合创始人,深度学习框架 Apache MXNet 的创始人之一。目前是 BosonAI 联合创始人…

C++之STL—string容器

本质:类 class 封装了很多方法:查找find,拷贝copy,删除delete 替换replace,插入insert 构造函数 赋值操作 assign: 字符串拼接 + append: string查找和替换 没查找到,po…

【刷题2—滑动窗口】最大连续1的个数lll、将x减到0的最小操作数

目录 一、最大连续1的个数lll二、将x减到0的最小操作数 一、最大连续1的个数lll 题目: 思路: 问题转换为:找到一个最长子数组,这个数组里面0的个数不能超过k个 定义一个变量count,来记录0的个数,进窗口、…

时序预测 | Python实现KAN+LSTM时间序列预测

时序预测 | Python实现KAN+LSTM时间序列预测 目录 时序预测 | Python实现KAN+LSTM时间序列预测预测效果基本介绍程序设计预测效果 基本介绍 时序预测 | KAN+LSTM时间序列预测(Python) KAN作为这两年最新提出的机制,目前很少人用,很适合作为时间序列预测的创新点,可以结合…

【重学 MySQL】三十八、group by的使用

【重学 MySQL】三十八、group by的使用 基本语法示例示例 1: 计算每个部门的员工数示例 2: 计算每个部门的平均工资示例 3: 结合 WHERE 子句 WITH ROLLUP基本用法示例注意事项 注意事项 GROUP BY 是 SQL 中一个非常重要的子句,它通常与聚合函数(如 COUNT…

MySQL和SQL的区别简单了解和分析使用以及个人总结

MySQL的基本了解 运行环境,这是一种后台运行的服务,想要使用必须打开后台服务,这个后台服务启动的名字是在安装中定义的如下图(个人定义MySQL88)区分大小写图片来源 可以使用命令net start/stop 服务名,开…

实验十八:IIC-EEPROM实验

这个实验比较复杂,是目前第一个多文件项目 KEY1-4:P3^0-P3^3 IIC_SCL=P2^1; IIC_SDA=P2^0; //定义数码管位选信号控制脚 LSA=P2^2; LSB=P2^3; LSC=P2^4; 代码 main.c #include "public.h" #in

常见汽车零部件ASIL等级示例

ASIL(Automotive Safety Integrity Level,汽车安全完整性等级)评级系统是ISO 26262标准中定义的一套风险分类体系,用于评估道路车辆中电子电气系统(E/E系统)功能安全的风险程度,并确保这些系统在…

Linux相关概念和重要知识点(6)(make、makefile、gdb)

1.make、makefile (1)什么是make、makefile? 在我们写完代码后,要编译运行,如果有多个.c文件就需要每次都自己用gcc -o来处理,这十分麻烦。当我们想要自定义多个文件的处理时,我们会浪费很多时…

MatrixOne助力一道创新打造高性能智能制造AIOT系统

客户简介 深圳一道创新(ETAO Innovation)成立于2012年,是一家创新型软件及信息技术服务商,致力于制造戏份行业—电子制造业的数字转型服务,构建万物互联的智能工程。一道创新致力于把先进的软件系统、数字平台、人工智…

拯救者Legion R9000X 2021R(82K8)原厂Win10与Windows11系统恢复镜像下载

LENOVO联想拯救者R9000X锐龙版2021款【82K8】预装OEM系统WIN11/10安装包,恢复原装出厂时开箱状态一模一样 链接:https://pan.baidu.com/s/15dGwacsEG0G8pOiZAHyXaQ?pwd0xgk 提取码:0xgk 联想原装出厂系统自带所有驱动、出厂主题壁纸、系统…

得物App荣获新奖项,科技创新助力高质量发展

近日,备受瞩目的2024中国国际服务贸易交易会(简称“服贸会”)在北京盛大开幕,这一全球唯一的国家级、国际性、综合型服务贸易盛会再次汇聚了全球服务贸易领域的精英与前沿成果。服贸会由商务部和北京市政府携手打造,并…

大数据系统调优:从DAG到单机

目标:优化T10的时效性全局DAG调度层优化:提前任务开始时间: 1. 优化慢结点:T10依赖了T4,T7,T8, 其中T8为瓶颈,如果T8能提前点完成,T10可以早点开始,就能早点完成 2. 快结点做更多预计算…

Android Studio 真机USB调试运行频繁掉线问题

一、遇到问题 Android Studio使用手机运行项目时,总是频繁掉线,连接很不稳定,动不动就消失,基本上无法使用 二、问题出现原因 1、硬件问题:数据线 换条数据线试试,如果可以,那就是数据线的…

如何登录通义灵码,快速开启AI编码之旅?

通义灵码个人版开发者可以使用阿里云账号登录通义灵码 IDE 端插件,本文介绍个人版开发者登录 IDE 端插件的操作指南。 登录通义灵码 步骤 1:准备工作 已成功注册阿里云账号,具体操作可参考:账号注册(PC端)…