二叉树——二叉树展开为链表

题目要求:
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null
展开后的单链表应该与二叉树 先序遍历 顺序相同。

规则:

  1. 顺序 = 先序遍历(根->左->右)
  2. 所有节点left = null
  3. 所有节点用right串联

一句话思路
按照先序遍历,把前一个节点的 right 指向当前节点,同时把 left 置空。

因为先序遍历的顺序是根左右,在flatten中传入root根节点,按照先序遍历的顺序访问完根节点后遍历左子树,flatten(root.left),进入左子树的递归,此时root = root.left,因为左孩子的先驱节点prev 非空,因此保存当前节点的右孩子 TreeNode right = root.right,断开先驱节点的左孩子也就是断开当前节点,将当前节点root连接到先驱节点的右子树,再更新先驱节点为当前节点root。因为要修改节点的right,因此每一层递归都要保存当前节点的右孩子,后续递归右孩子的时候当前层才能找到他的右孩子并连接到链表上

完整代码实现如下:

class Solution {

// 用来记录上一个节点
private TreeNode prev = null;

public void flatten(TreeNode root) {
    if (root == null) return;

    // 因为要修改 right,必须先把右子树保存下来
    TreeNode right = root.right;

    // 核心逻辑
    if (prev != null) {
        prev.left = null;   // 左指针置空
        prev.right = root; // 上一个节点的 right 指向当前节点
    }
    
    // 当前节点变成下一次的“上一个节点”
    prev = root;

    // 先序:根 → 左 → 右
    flatten(root.left);
    flatten(right); // 用保存的右子树
}

}

posted @ 2026-04-22 14:40  AlexXuu  阅读(2)  评论(0)    收藏  举报