每日一题-二叉树展开为链表
2022.4.20
114. 二叉树展开为链表
给你二叉树的根结点 root ,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用 - TreeNode,其中- right子指针指向链表中下一个结点,而左子指针始终为- null。
- 展开后的单链表应该与二叉树 先序遍历 顺序相同。 
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
题解:
这种父子节点关系转化的题目,一般的思路,是递归,递归的话需要将问题转化为一般性的子问题:对于某个节点root,需要对其左子树拉平,右子树拉平,再将右子树接到左子树的右下方,接好后的整个左子树接到root右下方
class Solution {
    // 定义:将以 root 为根的树拉平为链表
void flatten(TreeNode root) {
    // base case
    if (root == null) return;
    
    flatten(root.left);
    flatten(root.right);
    /**** 后序遍历位置 ****/
    // 1、左右子树已经被拉平成一条链表
    TreeNode left = root.left;
    TreeNode right = root.right;
    
    // 2、将左子树作为右子树
    root.left = null;
    root.right = left;
    // 3、将原先的右子树接到当前右子树的末端
    TreeNode p = root;
    while (p.right != null) {
        p = p.right;
    }
    p.right = right;
}
} 
