news 2026/5/17 2:19:52

046二叉树展开为链表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
046二叉树展开为链表

二叉树展开为链表

题目链接:https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/?envType=study-plan-v2&envId=top-100-liked

我的解答:

List<TreeNode> list = new ArrayList<>(); public void flatten(TreeNode root) { if(root == null){ return; } getList(root); for(int i=1; i<list.size(); i++){ list.get(i-1).left = null; list.get(i-1).right = list.get(i); } } public void getList(TreeNode node){ if(node == null){ return; } list.add(node); getList(node.left); getList(node.right); }

分析:代码的时间复杂度为O(n),空间复杂度为O(n)。自己未能想出时间复杂度为O(n)且空间复杂度为O(1)的解法。解题思路:用递归对二叉树进行前序遍历,用集合存储二叉树先序遍历的结果,然后遍历集合更改指针关系即可。

看了官方题解后的解答:

//方法一:前序遍历(递归版)(与我的解答一致) //时间复杂度:O(n) //空间复杂度:O(n) //方法一:前序遍历(迭代版) //时间复杂度:O(n) //空间复杂度:O(n) public void flatten(TreeNode root) { Deque<TreeNode> stack = new LinkedList<>(); List<TreeNode> list = new ArrayList<>(); TreeNode node = root; while(node != null || !stack.isEmpty()){ while(node != null){ list.add(node); stack.push(node); node = node.left; } node = stack.pop().right; } for(int i = 1; i < list.size(); i++){ list.get(i-1).right = list.get(i); list.get(i-1).left = null; } } //方法二(只看思路自己实现版):前序遍历和展开同步进行 //时间复杂度:O(n) //空间复杂度:O(n) public void flatten(TreeNode root) { if(root == null){ return; } Deque<TreeNode> stack = new LinkedList<>(); TreeNode cur = root, pre = null; while(cur != null || !stack.isEmpty()){ while(cur != null){ if(cur.right != null){ stack.push(cur.right); } if(pre != null){ pre.right = cur; pre.left = null; } pre = cur; cur = cur.left; } if(!stack.isEmpty()){ cur = stack.pop(); } } } //方法二(看了官方实现版,优于只看思路自己实现版):前序遍历和展开同步进行 //时间复杂度:O(n) //空间复杂度:O(n) public void flatten(TreeNode root) { if(root == null){ return; } Deque<TreeNode> stack = new LinkedList<>(); TreeNode pre = null, cur; stack.push(root); while(!stack.isEmpty()){ cur = stack.pop(); if(pre != null){ pre.right = cur; pre.left = null; } if(cur.right != null){ stack.push(cur.right); } if(cur.left != null){ stack.push(cur.left); } pre = cur; } } //方法三:寻找前驱节点 //时间复杂度:O(n) //空间复杂度:O(1) public void flatten(TreeNode root) { TreeNode cur = root, right; while(cur != null){ if(cur.left != null){ TreeNode temp = cur.left; while(temp.right != null){ temp = temp.right; } temp.right = cur.right; cur.right = cur.left; cur.left = null; } cur = cur.right; } }

分析:

​ 1、方法一和方法二都采用二叉树的前序遍历方法,区别在于,方法一是将前序遍历的结果存入集合中,遍历完后再遍历集合更改指针关系;而方法二利用栈保存了每个节点的右孩子信息,每次右孩子先入栈,左孩子后入栈,且用pre保存当前已经展开的链表尾节点,每次出栈的同时更改pre的指针关系。重复以上操作直到栈为空。

​ 2、方法三的解题思路:遍历到当前节点时分为两种情况——若当前节点左孩子为空,则无需做任何改变;若当前节点左孩子不为空,根据前序遍历的顺序关系,每次找到当前节点的左子树前序遍历的最后一个节点(最右节点),将当前节点的右子树连接到最右节点,然后让当前节点的左孩子成为右孩子,并让左孩子为空,最后继续遍历下一个节点。重复以上操作直到当前节点为空。

总结

  • 本题主要是需要掌握二叉树的前序遍历的流程和特点。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/17 2:19:50

ARM CP15寄存器与内存重映射技术详解

1. ARM系统控制寄存器深度解析在嵌入式系统开发领域&#xff0c;ARM架构处理器因其出色的能效比和丰富的功能特性而广受欢迎。作为系统开发人员&#xff0c;深入理解ARM处理器的核心控制机制至关重要。CP15协处理器&#xff08;系统控制协处理器&#xff09;就是这样一个关键组…

作者头像 李华
网站建设 2026/5/17 2:17:46

Kubernetes服务发现与负载均衡最佳实践

Kubernetes服务发现与负载均衡最佳实践 引言 服务发现和负载均衡是微服务架构中的核心组件&#xff0c;它们确保服务之间能够高效、可靠地通信。本文将深入探讨Kubernetes中的服务发现机制和负载均衡策略。 一、服务发现架构 1.1 服务发现层次 ┌───────────────…

作者头像 李华
网站建设 2026/5/17 2:15:56

BepInEx启动失败的终极解决方案:从新手到专家的完整指南

BepInEx启动失败的终极解决方案&#xff1a;从新手到专家的完整指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是Unity游戏插件框架的核心&#xff0c;但当它启动失败…

作者头像 李华
网站建设 2026/5/17 2:14:22

终极窗口尺寸控制神器:WindowResizer完整使用指南

终极窗口尺寸控制神器&#xff1a;WindowResizer完整使用指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些固执的应用程序窗口而烦恼吗&#xff1f;老旧软件在4K显示…

作者头像 李华
网站建设 2026/5/17 2:14:19

代码库分析实战:从静态解析到架构可视化的自动化工具链

1. 项目概述&#xff1a;当代码库成为“黑盒”&#xff0c;我们如何让它开口说话&#xff1f;在软件开发与维护的日常中&#xff0c;我们常常会面对一个令人头疼的困境&#xff1a;接手一个庞大、复杂且文档缺失的遗留代码库。它就像一个沉默的“黑盒”&#xff0c;你隐约知道它…

作者头像 李华
网站建设 2026/5/17 2:13:15

激光切割自制PCB钢网:快速原型验证与低成本SMT焊接方案

1. 项目概述&#xff1a;为什么选择激光切割自制PCB钢网&#xff1f;在硬件开发&#xff0c;尤其是涉及表面贴装技术&#xff08;SMT&#xff09;的电路板制作中&#xff0c;钢网是一个绕不开的工具。它的作用很简单&#xff1a;在PCB的焊盘上&#xff0c;精准地涂布一层厚度均…

作者头像 李华