LeetCode 114
https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/
难度:中等
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
采用头插法构建链表,按照右子树 - 左子树 - 根的顺序 DFS 这棵树。DFS 的同时,记录当前链表的头节点为 head。一开始 head 是空节点。
具体来说:
- 如果当前节点为空,返回。
- 递归右子树。
- 递归左子树。
- 把 root.left 置为空。
- 头插法,把 root 插在 head 的前面,也就是 root.right=head。
- 现在 root 是链表的头节点,把 head 更新为 root。
时间复杂度:O(n),其中 n 是二叉树的节点个数。
空间复杂度:O(n)。递归需要 O(n) 的栈空间。
class Solution {
TreeNode* head;
public:
void flatten(TreeNode* root) {
if (root == nullptr) {
return;
}
flatten(root->right);
flatten(root->left);
root->left = nullptr;
root->right = head; // 头插法,相当于链表的 root->next = head
head = root; // 现在链表头节点是 root
}
};