题目描述
给你二叉树的根结点 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]
原始二叉树(示例 1):
1
/ \
2 5
/ \ \
3 4 6
展开后链表(只看 right 指针):
1 → 2 → 3 → 4 → 5 → 6
解题思路
方法一:递归 + 后序处理
核心思想: 采用后序遍历的方式,从下往上处理。保证在处理当前节点时,左右子树已经各自被展平为链表。
步骤:
- 递归展开左子树和右子树。
- 将当前节点的右子树暂存。
- 将当前节点的右子树设为左子树(此时左子树已展开为链表)。
- 将左子树置空。
- 找到当前右子树(原左子树)的最右节点,将其
right指向暂存的原右子树。
方法二:迭代(使用栈模拟先序遍历)
核心思想: 用栈模拟先序遍历,同时在遍历过程中调整指针。
步骤:
- 使用栈存储待访问节点。
- 每次弹出一个节点,将其右、左子节点依次压入栈(因为栈是 LIFO,所以先压右再压左,保证先访问左)。
- 在遍历过程中,将前一个节点的 指向当前节点,并将 置空。


