leetcode 114 二叉树展开为链表

image-20211029094712661

先序遍历会出现问题,因为修改 right 指针会导致后面的调用 root.right 出现错误。

1
2
3
4
5
6
7
1. 先序遍历
	利用 O(n) 额外空间的 list 来存先序遍历的每一个节点然后利用 list 来还原结果
    
2. 寻找前驱节点
	利用 O(1) 空间对于每个节点找到其左子树的最右边节点作为前驱节点将右子树放到前驱节点后迭代方式
    
3. 利用后序遍历递归方式

其实2和3的方式是相似的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 方式3
public void flatten(TreeNode root) {
    if (root == null)
        return;
    flatten(root.left);
    flatten(root.right);
    TreeNode left = root.left;
    TreeNode right = root.right;
    // concat list
    root.right = left;
    root.left = null;
    TreeNode p = root;
    while (p.right != null) {
        p = p.right;
    }
    p.right = right;
}

梳理以下思路:

  1. root的左子树和右子树拉平。
  2. root的右子树接到左子树的下方,然后将整个左子树作为右子树。