📜  将给定的二叉树转换为双向链表 |设置 1(1)

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

将给定的二叉树转换为双向链表 |设置 1

在树的数据结构中,有时需要将二叉树转换为双向链表,以方便对树的遍历和操作。在这个任务中,我们要实现一个函数,将给定的二叉树转换成一个双向链表,并返回链表的头结点。

实现这个任务的关键是递归遍历树的节点。对于每个节点,我们需要将它的左子树和右子树转化为双向链表,并将左链表和右链表和当前节点连接起来。

以下是该算法实现的代码:

class TreeNode:
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def TreeToList(self, root):
        if not root:
            return None

        # 递归将左子树转化为链表
        left = self.TreeToList(root.left)

        # 寻找左链表的尾节点
        tail = left
        while tail and tail.right:
            tail = tail.right

        # 将当前节点与左链表尾节点相连
        if tail:
            tail.right = root
            root.left = tail
        else:
            left = root

        # 递归将右子树转化为链表
        right = self.TreeToList(root.right)

        # 将当前节点与右链表头节点相连
        if right:
            right.left = root
            root.right = right

        return left

该算法的时间复杂度为$O(n)$,因为它需要遍历每个节点恰好一次,其中$n$是节点数量。空间复杂度为$O(h)$,因为递归调用栈的深度最高为树的高度$h$。

运行该算法的示例代码如下:

root = TreeNode(4)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(1)
root.left.right = TreeNode(3)

lst_head = Solution().TreeToList(root)

# 遍历链表,检查它是否正确构造
lst = []
while lst_head:
    lst.append(lst_head.val)
    lst_head = lst_head.right

print(lst)  # Output: [1, 2, 3, 4, 5]

可以看到,该算法成功地将给定的二叉树转换为了一个双向链表,并且其遍历顺序与树的中序遍历顺序一致。