Leecode hot100 - 114. 二叉树展开为链表 基础方法到提高方法
题目描述
https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/?envType=problem-list-v2&envId=2cktkvj
给你二叉树的根结点 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]
思路
“改造” 树的结构,让树变成单链表形态(左指针全为 null,右指针串联所有节点)
代码(基础)
class Solution:
def flatten(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
# 先序遍历收集节点(颜色标记法)
white, gray = 0, 1
res = []
stack = [(root, white)] # 使用元组
while stack:
node, color = stack.pop()
if node is None:
continue
if color == white:
# 保持与栈初始化一致的元组形式
stack.append((node.right, white))
stack.append((node.left, white))
stack.append((node, gray))
else:
res.append(node)
# 串联节点,构建单链表
for i in range(len(res)):
if i < len(res) - 1:
res[i].right = res[i+1]
else:
res[i].right = None
res[i].left = None
return root
代码(优化)
class Solution:
head = None
def flatten(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
if root is None:
return
# 后序遍历:先处理右子树,再处理左子树
self.flatten(root.right)
self.flatten(root.left)
# 头插法构建单链表
root.left = None # 左指针置空
root.right = self.head # 当前节点右指针指向已构建的链表头部
self.head = root # 更新链表头部为当前节点
复杂度分析
两种代码均为O(n)
-
时间复杂度:O(n),其中 n 是二叉树的节点个数。
-
空间复杂度:O(n)。递归需要 O(n) 的栈空间。