114. Flatten Binary Tree to Linked List 二叉树展开为链表

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

例如,给定二叉树

    1
   / \
  2   5
 / \   \
3   4   6

将其展开为:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6

前序遍历

将二叉树展开为单链表之后,单链表中的节点顺序即为二叉树的前序遍历访问各节点的顺序。因此,可以对二叉树进行前序遍历,获得各节点被访问到的顺序。由于将二叉树展开为链表之后会破坏二叉树的结构,因此在前序遍历结束之后更新每个节点的左右子节点的信息,将二叉树展开为单链表。

Code

	def flatten(self, root: TreeNode) -> None:
		"""
        Do not return anything, modify root in-place instead.
        """
		def preOrderTraversal(root: TreeNode):
			if root:
				preOrderList.append(root)
				preOrderTraversal(root.left)
				preOrderTraversal(root.right)

		preOrderList = []
		preOrderTraversal(root)
		size = len(preOrderList)
		for i in range(1, size):
			prev, curr = preOrderList[i - 1], preOrderList[i]
			prev.left = None
			prev.right = curr

复杂度分析

时间复杂度:O(n),其中 n 是二叉树的节点数。前序遍历的时间复杂度是 O(n),前序遍历之后,需要对每个节点更新左右子节点的信息,时间复杂度也是 O(n)。

空间复杂度:O(n),其中 n 是二叉树的节点数。空间复杂度取决于栈(递归调用栈或者迭代中显性使用的栈)和存储前序遍历结果的列表的大小,栈内的元素个数不会超过 n,前序遍历列表中的元素个数是 nn。

猜你喜欢

转载自blog.csdn.net/weixin_43336281/article/details/107740501