📜  将二叉树展平为链表 |第 3 组(1)

📅  最后修改于: 2023-12-03 15:09:33.975000             🧑  作者: Mango

将二叉树展平为链表 |第 3 组

题目描述

给定一个二叉树,原地将它展开为一个单链表。

例如,给定二叉树

    1
   / \
  2   5
 / \   \
3   4   6

展开后的单链表应为:

1 -> 2 -> 3 -> 4 -> 5 -> 6
解题思路

将每个节点的左子树拼接到其右子树的下面。具体的做法是:

  1. 如果当前节点有左子树,那么就将其左子树移到其右子树的位置,原来的右子树接到原左子树的最右边的节点上。
  2. 对新的右子树进行递归操作。
代码实现
class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        if not root:
            return
        
        self.flatten(root.left)
        self.flatten(root.right)
        
        left = root.left
        right = root.right
        root.left = None
        root.right = left
        
        while root.right:
            root = root.right
        
        root.right = right
class Solution {
    public void flatten(TreeNode root) {
        if (root == null) {
            return;
        }
        flatten(root.left);
        flatten(root.right);
        TreeNode left = root.left;
        TreeNode right = root.right;
        root.left = null;
        root.right = left;
        TreeNode cur = root;
        while (cur.right != null) {
            cur = cur.right;
        }
        cur.right = right;
    }
}
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 是树的节点数。展开一个最深的右子树的时间代价是 $O(n)$,假设最终展开的单链表的长度为 $m$,那么总时间复杂度就是 $O(n+m)$。由于 $m \leq n$,因此总时间复杂度为 $O(n)$。
  • 空间复杂度:$O(1)$。我们只需要常数的空间存放若干变量。