二叉树——二叉树展开为链表
题目要求:
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null
展开后的单链表应该与二叉树 先序遍历 顺序相同。
规则:
- 顺序 = 先序遍历(根->左->右)
- 所有节点left = null
- 所有节点用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); // 用保存的右子树
}
}
浙公网安备 33010602011771号