📅  最后修改于: 2023-12-03 15:09:38.917000             🧑  作者: Mango
在树的数据结构中,有时需要将二叉树转换为双向链表,以方便对树的遍历和操作。在这个任务中,我们要实现一个函数,将给定的二叉树转换成一个双向链表,并返回链表的头结点。
实现这个任务的关键是递归遍历树的节点。对于每个节点,我们需要将它的左子树和右子树转化为双向链表,并将左链表和右链表和当前节点连接起来。
以下是该算法实现的代码:
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]
可以看到,该算法成功地将给定的二叉树转换为了一个双向链表,并且其遍历顺序与树的中序遍历顺序一致。