LeetCode 114. Flatten Binary Tree to Linked List(Python)

本文介绍了一种将二叉树结构通过前序遍历的方式展平为链表的方法,并提供了一个具体的AC代码实现。通过对二叉树进行前序遍历并利用列表保存节点,最终将二叉树转换成一个链表。

题目描述:
Given a binary tree, flatten it to a linked list in-place.

For example,
Given

     1
    / \
   2   5
  / \   \
 3   4   6

The flattened tree should look like:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6

思路:
用列表保存该二叉树的前序遍历的结点,最后循环列表重新赋左右子树。

AC代码:

class Solution(object):
    def flatten(self, root):
        """
        :type root: TreeNode
        :rtype: void Do not return anything, modify root in-place instead.
        """
        ans = []
        def preOrderTravel(root):
            if not root:
                return
            ans.append(root)
            preOrderTravel(root.left)
            preOrderTravel(root.right)
        preOrderTravel(root)
        copy = root
        for i in range(1, len(ans)):
            copy.left = None
            copy.right = ans[i]
            copy = ans[i]
### 双向链表的Python实现 #### 定义结点类 为了创建双向链表,首先需要定义一个`Node`类来表示单个节点。每个节点包含三个属性:存储的数据(`data`)、指向下一个节点的指针(`next`)以及指向前一个节点的指针(`prev`)。 ```python class Node: def __init__(self, data=None): self.data = data self.next = None self.prev = None ``` #### 定义链表类 接着定义`DoublyLinkedList`类用于管理这些节点并提供操作接口。初始化方法设置头部和尾部为空,并维护列表大小计数器。 ```python class DoublyLinkedList: def __init__(self): self.head = None self.tail = None self.size = 0 ``` #### 插入新节点的方法 可以在链表的不同位置插入新的节点,这里展示两种常见的插入方式: ##### 头插法 在链表开头添加一个新的节点作为新的头节点。 ```python def add_first(self, value): new_node = Node(value) if not self.head: self.head = self.tail = new_node else: new_node.next = self.head self.head.prev = new_node self.head = new_node self.size += 1 ``` ##### 尾插法 在链表结尾处追加一个新节点成为新的尾节点。 ```python def add_last(self, value): new_node = Node(value) if not self.tail: self.head = self.tail = new_node else: new_node.prev = self.tail self.tail.next = new_node self.tail = new_node self.size += 1 ``` #### 删除指定值的第一个匹配项 此功能允许移除首次出现的目标元素对应的节点。 ```python def remove(self, target_value): current = self.head while current and current.data != target_value: current = current.next if not current: return False # Not found if current.prev is None: self.head = current.next else: current.prev.next = current.next if current.next is None: self.tail = current.prev else: current.next.prev = current.prev self.size -= 1 return True ``` 以上实现了基本的双向链表结构及其核心增删改查的功能[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值