114. 二叉树展开为链表
🔗 题目链接:114. 二叉树展开为链表
核心要点
原地修改:不能创建新的TreeNode链表,必须直接修改原二叉树的left和right指针;
顺序要求:单链表顺序 = 原二叉树前序遍历顺序(根 → 左 → 右);
指针规范:所有节点的left指针必须置为null,right指针串联整个链表
核心思路:以当前root为基准,递归左右树,使左树变成链表,右树同理,那么怎么拼接成答案呢??定义临时变量存储二者,使左为null,右为存储的左链表,最后递归root定位最后一个非空节点,指向先前存储的right即可
💻途中遇到的一些纠结点:
🔥代码实现(Java)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void flatten(TreeNode root) {
// 1. 如果当前节点为空,直接返回
if (root == null) return;
// 2. 递归展平左子树和右子树
flatten(root.left);
flatten(root.right);
// 3. 保存左右子树到临时变量
TreeNode left = root.left;
TreeNode right = root.right;
// 4. 将左子树移动到右子树位置,左子树置空
root.left = null;
root.right = left;
// 5. 找到当前右子树的末尾
TreeNode copy = root;
while (copy.right != null) {
copy = copy.right;
}
// 6. 将原来的右子树接到末尾
copy.right = right;
}
}
📎 复杂度分析
- 时间复杂度:O(n),其中 n 是二叉树节点数。每个节点访问一次。
- 空间复杂度:O(h),其中 h 是二叉树的高度。递归栈的深度取决于树的高度(最坏情况为 O(n))。