114. 二叉树展开为链表

news/2024/12/22 11:32:45/

114. 二叉树展开为链表

描述

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例:
给定二叉树 [3,9,20,null,null,15,7]

示例

示例1
示例1

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

示例2

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

示例3

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

链接

https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/

解题思路

思路一: 后序遍历

  1. 将root的左子树和右子树展开;
  2. 将root的右子树接到左子树下方,然后将整个左子树作为右子树

实现代码如下:

/*** @param {TreeNode} root* @return {void} Do not return anything, modify root in-place instead.*/
var flatten = function(root) {if (root == null) return root;flatten(root.left);flatten(root.right);// 后序遍历位置let leftNode = root.left, rightNode = root.right;// 将左子树变为右子树root.left = null;root.right = leftNode;// 将原先的右子树接到当前右子树的末端let p = root;while(p.right != null) {p = p.right;}p.right = rightNode;
}

思路二: 前序遍历和展开同步进行

每次从栈内弹出一个节点作为当前访问的节点,获得该节点的子节点,如果子节点不为空,则依次将右子节点和左子节点压入栈内(注意入栈顺序)。

展开为单链表的做法是,维护上一个访问的节点 prev,每次访问一个节点时,令当前访问的节点为 curr,将 prev 的左子节点设为 null 以及将 prev 的右子节点设为 curr,然后将 curr 赋值给 prev,进入下一个节点的访问,直到遍历结束。需要注意的是,初始时 prev 为 null,只有在 prev 不为 null 时才能对 prev 的左右子节点进行更新

注意:先是右节点入栈

/*** @param {TreeNode} root* @return {void} Do not return anything, modify root in-place instead.*/
var flatten = function(root) {if (root == null) return root;let stack = [root], prev = null;while(stack.length) {let curr = stack.pop();if (prev !== null) {prev.left = null;prev.right = curr;}const left = curr.left, right = curr.right;if (right !== null) {stack.push(right);}if (left !== null) {stack.push(left);}prev = curr; }  
};

时间复杂度: O(n) , n 是二叉树的节点数
空间复杂度: O(n)

参考资料

https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/solution/er-cha-shu-zhan-kai-wei-lian-biao-by-leetcode-solu/
https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by–26/


http://www.ppmy.cn/news/77744.html

相关文章

【vue3】需要了解哪些【未完结】

这里写目录标题 一.vue3入门1. vue3带来了什么2. vue3工程的创建1. 使用vue-cli创建2. 使用vite创建与webpack的区别 二、常用Composition API1. setup(函数和语法糖)2. ref 和reactive3. vue3的响应式原理1. Vue2 的响应式原理2.vue3的的响应式原理 4.computed5.watch6. watch…

C++由于错误使用下标运算符引发的未定义错误

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、下标运算符是什么?二、复现步骤1.写一个简单的类层次2.原因解析2.解决方法 总结 前言 本节讲一个由于下标使用错误引发的未定义错误&#xff0…

Android java层hook------xposed框架的使用

xposed曾经是android平台上最好的java层hook和调试工具,由于已经不再更新,当前支持的android系统版本比较老旧,目前只能支持到android6.0,故已经逐渐落伍,目前android上最广泛使用的hook工具是frida,这是另…

抖音账号矩阵系统源码/技术开发搭建私有化部署开源

抖音SEO矩阵系统是基于抖音平台的搜索引擎优化技术的一种系统,其主要作用是通过一系列的技术手段,提高抖音视频的曝光和排名,使其获得更多的流量和粉丝。在本文中,我们将介绍抖音SEO矩阵系统的开发技术,包括系统设计、…

小米手机系列的演进:从小米1到小米13

1. 小米1(2011年):小米1是小米公司的首款旗舰手机,以超低的售价提供出色的硬件配置和流畅的用户体验。它打破了传统手机市场的价格壁垒,受到广大用户的欢迎。 2. 小米2(2012年):小米…

算法训练-二分查找

这里写目录标题 34. 在排序数组中查找元素的第一个和最后一个位置162. 寻找峰值153. 寻找旋转排序数组中的最小值33. 搜索旋转排序数组 34. 在排序数组中查找元素的第一个和最后一个位置 题目链接 vector<int> searchRange(vector<int>& nums, int target) {i…

Python之后端Django(二)

Day/2 模型: mysql数据库服务端软件安装&#xff1a;sudo apt-get install mysql-server mysql数据库命令行客户端安转&#xff1a;sudo apt-get install mysql-client数据库操作基本流程&#xff1a; 创建数据库 (create database 数据名称 charsetutf8;) 使用数据库 (use …

Spring 整合 Mybatis -- Spring入门保姆级教程(四)

文章目录 前言五、Spring 整合 Mybatis1.Mybatis一般开发流程2.spring整合mybatis思路分析3.Spring整合Mybatis环境准备&#xff08;注解开发&#xff09;4.Spring整合Mybatis5.小结 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xf…