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

题目要求:
给你二叉树的根结点 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  ZealousMclaren  阅读(9)  评论(0)    收藏  举报