更新时间:2025-04-04
- 算法题解目录汇总:算法刷题记录——题解目录汇总
- 技术博客总目录:计算机技术系列博客——目录页
优先整理热门100及面试150,不定期持续更新,欢迎关注!
114. 二叉树展开为链表
给你二叉树的根结点 root
,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode
,其中 right
子指针指向链表中下一个结点,而左子指针始终为 null
。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 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]
提示:
树中结点数在范围 [0, 2000] 内
-100 <= Node.val <= 100
进阶:
你可以使用原地算法(O(1)
额外空间)展开这棵树吗?
方法一:迭代先序遍历(显式栈)
利用栈模拟先序遍历,维护前驱节点prev,实时修改指针建立链表。
- 核心思想:利用栈按「根→右→左」顺序压入节点,确保弹出顺序为「根→左→右」。
- 指针调整:维护前驱节点
prev
,每次将prev
的right
指向当前节点,并清空left
指针。 - 空间优化:栈的深度为树高,平均空间复杂度为
O(log n)
。
代码实现(Java):
public class Solution {public void flatten(TreeNode root) {if (root == null) return;Stack<TreeNode> stack = new Stack<>();stack.push(root);TreeNode prev = null;while (!stack.isEmpty()) {TreeNode current = stack.pop();// 将前驱节点的right指向当前节点,left置空if (prev != null) {prev.right = current;prev.left = null;}prev = current;// 先压入右子节点,再压入左子节点(栈的LIFO特性)if (current.right != null) stack.push(current.right);if (current.left != null) stack.push(current.left);}}
}
方法二:递归后序遍历(连接左右子树)
递归处理左右子树,将左子树连接到右子树之前,并更新末尾节点。
- 核心思想:将左子树末尾连接到右子树头部,再让根节点指向左子树。
- 末尾处理:返回展开后的最后一个节点,避免每次遍历链表末尾,时间复杂度优化至
O(n)
。 - 逻辑简化:通过后序遍历自底向上处理,确保左子树完全展开后再处理根节点。
代码实现(Java):
public class Solution {public void flatten(TreeNode root) {flattenHelper(root);}private TreeNode flattenHelper(TreeNode node) {if (node == null) return null;// 递归处理左右子树,获取展开后的末尾节点TreeNode leftTail = flattenHelper(node.left);TreeNode rightTail = flattenHelper(node.right);// 将左子树插入到当前节点与右子树之间if (node.left != null) {leftTail.right = node.right;node.right = node.left;node.left = null;}// 返回当前子树展开后的最后一个节点return (rightTail != null) ? rightTail : (leftTail != null) ? leftTail : node;}
}
复杂度分析
- 时间复杂度:两种方法均为
O(n)
,每个节点被访问一次。 - 空间复杂度:
- 迭代法:
O(h)
,h为树高,最坏情况(链表结构)为O(n)
。 - 递归法:
O(h)
,递归栈深度为树高。
- 迭代法:
对比总结
- 迭代法:适合大规模数据或树结构较深时,避免递归栈溢出。
- 递归法:代码简洁,适合对代码可读性要求高,且无栈溢出风险的场景。
声明
- 本文版权归
CSDN
用户Allen Wurlitzer
所有,遵循CC-BY-SA
协议发布,转载请注明出处。- 本文题目来源
力扣-LeetCode
,著作权归领扣网络
所有。商业转载请联系官方授权,非商业转载请注明出处。