📅  最后修改于: 2023-12-03 15:42:16.791000             🧑  作者: Mango
这道题涉及到二叉树的遍历以及链表的基本操作。为了用更清晰的方式来介绍题目,我将问题重述如下:
给定一棵二叉树,其中每个节点都有一个整数值。从根节点出发,按照先序遍历的顺序,将所有节点按照先后顺序串联起来,得到一个链表。例如,假设给定的二叉树为:
10 / \ 5 30 / \ 40 20
其对应的链表就是:
10 -> 5 -> 30 -> 40 -> 20
现在我们需要写一个函数来实现这个功能。下面是一段 Python 代码:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def flatten(root: TreeNode) -> None:
if root is None:
return
flatten(root.left)
flatten(root.right)
if root.left:
temp = root.right
root.right = root.left
root.left = None
curr = root.right
while curr.right:
curr = curr.right
curr.right = temp
这段代码的思路是:先递归地将左子树和右子树都转化成链表形式,然后将左子树拼接到根节点的右边,并将左子树清空。最后是重点:需要将根节点的右子树拼接到新串联的链表(即原来的左子树)的末尾。
这个解法的时间复杂度是 $O(n)$,其中 $n$ 是节点的总数(因为每个节点都会被遍历一次)。空间复杂度也是 $O(n)$(因为这里用了递归)。