当前位置: 首页 > news >正文

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

文章目录

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

翻转二叉树

给你一棵二叉树的根节点 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; // 如果树为空,直接返回 nullconst 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.lryc.cn/news/444798.html

相关文章:

  • 关于 SQL 的 JOIN 操作
  • 聊聊AUTOSAR:基于Vector MICROSAR的TC8测试开发方案
  • ES6中迭代器与生成器知识浅析
  • unix中的vfork函数
  • Android 用线程池实现一个简单的任务队列(Kotlin)
  • 遨游信息技术的浩瀚宇宙:探索MySQL的深邃奥秘
  • 【Bug解决】Nacos启动成功,但却无法访问(提示:无法访问此网站,192.168.10.88的响应时间过长)
  • 【AI创作组】工程方向的硕士研究生学习Matlab的路径
  • Mac使用Nginx设置代理,并禁用自带Apache
  • AlmaLinux 安裝JDK8
  • Set 和 Map 的模拟实现
  • 深度学习自编码器 - 预测稀疏分解(PSD)篇
  • 如何检测出来这个ip是共享ip不安全
  • TMStarget学习——T1 Segmentation数据处理及解bug
  • 锁策略, cas 和 synchronized 优化过程
  • 【HTML5】html5开篇基础(2)
  • 大数据新视界 --大数据大厂之 Reactjs 在大数据应用开发中的优势与实践
  • 【论文阅读笔记】TOOD: Task-aligned One-stage Object Detection
  • 类中的特殊内容
  • network request to https://registry.npmjs.org/xxx failed, reason: connect ETIM
  • MQ入门(二):java客户端SpringAMQP
  • 软技能与AI技术的融合
  • 在视频上绘制区域:使用Vue和JavaScript实现交互式画布
  • 31. RabbitMQ顺序消费
  • BERT-BiLSTM-CRF模型实战
  • npm 安装 与 切换 淘宝镜像
  • 在Windows系统上安装的 Arrow C++ 库
  • 格雷母线电缆头安装方法视频-武汉正向科技
  • 统信服务器操作系统【Cron定时任务服务】
  • 微前端中的路由加载流程