吃肉的刷题记录8-二叉树,链表

题目

二叉树转换为单链表,展开后的单链表应该与二叉树先序遍历顺序相同。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值