📜  门| GATE-CS-2009 |第 44 题(1)

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

门| GATE-CS-2009 |第 44 题

这道题涉及到二叉树的遍历以及链表的基本操作。为了用更清晰的方式来介绍题目,我将问题重述如下:

给定一棵二叉树,其中每个节点都有一个整数值。从根节点出发,按照先序遍历的顺序,将所有节点按照先后顺序串联起来,得到一个链表。例如,假设给定的二叉树为:

     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)$(因为这里用了递归)。