【算法--链表】114.二叉树展开为链表--通俗讲解
算法通俗讲解推荐阅读:
【算法–链表】83.删除排序链表中的重复元素–通俗讲解
【算法–链表】删除排序链表中的重复元素 II–通俗讲解
【算法–链表】86.分割链表–通俗讲解
【算法】92.翻转链表Ⅱ–通俗讲解
【算法–链表】109.有序链表转换二叉搜索树–通俗讲解
通俗易懂讲解“二叉树展开为链表”算法题目
一、题目是啥?一句话说清
给你一个二叉树的根节点,将它展开为一个单链表,其中节点的right指针指向下一个节点,left指针始终为null,且展开后的链表顺序与二叉树的先序遍历顺序相同。
示例:
- 输入:root = [1,2,5,3,4,null,6]
- 输出:[1,null,2,null,3,null,4,null,5,null,6](展开后的链表顺序为先序遍历顺序1,2,3,4,5,6)
二、解题核心
使用递归或迭代方法,对于每个节点,将其左子树插入到右子树之前,并保持先序遍历顺序。 这就像把一棵树拆成一条直线,保持从根节点开始先左后右的顺序。
三、关键在哪里?(3个核心点)
想理解并解决这道题,必须抓住以下三个关键点:
1. 先序遍历顺序保持
- 是什么:展开后的链表顺序必须与二叉树的先序遍历(根节点、左子树、右子树)顺序一致。
- 为什么重要:这是题目的基本要求,如果顺序错误,结果就不正确。
2. 原地修改指针
- 是什么:直接修改原二叉树的指针,而不是创建新节点。
- 为什么重要:题目要求原地修改,这样可以节省空间,但需要谨慎操作指针,避免丢失节点引用。
3. 左子树插入右子树之前
- 是什么:对于每个节点,如果左子树不为空,找到左子树的最右节点,将右子树连接到该最右节点的right指针,然后将左子树移动到右子树位置。
- 为什么重要:这确保了左子树的所有节点都在右子树之前,同时保持先序遍历顺序。
四、看图理解流程(通俗理解版本)
让我们用二叉树 [1,2,5,3,4,null,6] 的例子来可视化过程:
- 初始二叉树:
1/ \2 5/ \ \
3 4 6
- 处理根节点1:
- 左子树不为空(节点2),找到左子树的最右节点(节点4)。
- 将根节点的右子树(节点5)连接到节点4的right指针。
- 将根节点的左子树(节点2)移动到右子树位置,左指针设为null。
- 当前树变为:
1\2/ \
3 4\5\6
- 处理节点2:
- 左子树不为空(节点3),找到左子树的最右节点(节点3本身,因为无右子节点)。
- 将节点2的右子树(节点4)连接到节点3的right指针。
- 将节点2的左子树(节点3)移动到右子树位置,左指针设为null。
- 当前树变为:
1\2\3\4\5\6
-
处理节点3:
- 左子树为空,无需处理,继续处理右子树(节点4)。
-
处理节点4:
- 左子树为空,无需处理,继续处理右子树(节点5)。
-
处理节点5:
- 左子树为空,但右子树不为空(节点6),无需特殊操作。
-
最终链表:
所有节点通过right指针连接,left指针为null:1 → 2 → 3 → 4 → 5 → 6