题目
二叉树转换为单链表,展开后的单链表应该与二叉树先序遍历顺序相同。
1
/ \
2 5
/ \ \
3 4 6
简单方法一:
class TreeNode:
def __init__(self,x):
self.val = x
self.left = None
self.right = None
class ListNode:
def __init__(self,x):
self.val = x
self.next = None
def pre(root):
if root:
list_tree.append(root.val)
pre(root.left)
pre(root.right)
def creatListNode(l):
if l==None:
return None
head = ListNode(l[0])
curr = head
for i in range(1,len(l)):
curr.next = ListNode(l[i])
curr = curr.next
return head
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
list_tree = []
pre(root)
print(list_tree)
ret_ListNode = creatListNode(list_tree)
while ret_ListNode:
print(ret_ListNode.val)
ret_ListNode = ret_ListNode.next
优化方法二、
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def flatten(root: TreeNode) -> ListNode:
if not root:
return None
# 创建单链表的头节点
head = ListNode(root.val)
# 递归处理左子树和右子树
left_list = flatten(root.left)
right_list = flatten(root.right)
# 将左子树链表连接到当前节点后面
head.next = left_list
# 找到左子树链表的最后一个节点,并将右子树链表连接到其后
last = head
while last.next:
last = last.next
last.next = right_list
return head
def flatten_tree_to_list(root: TreeNode) -> ListNode:
return flatten(root)
# 构建示例二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
# 转换为单链表并返回头节点
list_head = flatten_tree_to_list(root)
# 输出单链表的值,以验证结果
result = []
while list_head:
result.append(list_head.val)
list_head = list_head.next
result