Python中链表的将二叉树每层的节点连接起来操作

2023-04-11 00:00:00 连接 节点 链表

题目描述

给定一颗二叉树,将每层的节点按照从左到右的顺序连接起来,最终形成一个链表,返回链表的头节点。

例如:给定二叉树为:

  1
 / \
2   3

/ \ \
4 5 6

返回的链表为:

1 -> 2 -> 3 -> 4 -> 5 -> 6

思路分析

这道题可以通过广度优先搜索的方式来解决,我们可以先用一个变量记录下当前层的节点数量,然后在遍历完这一层的所有节点后,再将下一层的所有节点连接起来。

具体的实现可以使用队列来保存每一层的节点,我们先将根节点入队,然后每次取出队列中的节点,将其左右子节点入队,并将其与队列中的下一个节点连接起来。在实现过程中,可以使用两个指针,一个指向当前层的最后一个节点,一个指向下一层的第一个节点。

代码演示

以下是Python实现的代码:

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

class Solution:
def connect(self, root: TreeNode) -> ListNode:
if not root:
return None
queue = [root]
dummy = ListNode(0)
tail = dummy
while queue:
n = len(queue)
for i in range(n):
node = queue.pop(0)
tail.next = ListNode(node.val)
tail = tail.next
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return dummy.next

解题思路

本题是一道比较基础的树的遍历问题,可以用递归或者迭代的方式解决。

对于递归的方法,我们只需要考虑每个节点所需要做的操作即可。对于当前节点,我们需要将其左右子节点相连,如果左右子节点都不为空,则将左子节点的next指针指向右子节点。而对于下一层的节点,则可以通过遍历当前层的节点,再将当前节点的所有子节点放入一个队列中,然后递归调用下一层的函数即可,代码如下:

def connect(self, root: 'Node') -> 'Node':
    if not root:
        return None

    if root.left and root.right:
        root.left.next = root.right

    if root.next and root.right:
        root.right.next = root.next.left

    self.connect(root.left)
    self.connect(root.right)

    return root

而对于迭代的方法,我们可以用一个队列来保存每一层的节点,然后在遍历完每一层节点后,将下一层的所有节点相连起来即可。在程序实现过程中,我们需要维护两个指针,一个用来连接当前层的节点,一个用来保存下一层的节点,具体代码如下:

def connect(self, root: 'Node') -> 'Node':
    if not root:
        return None

    queue = [root]
    while queue:
        n = len(queue)
        for i in range(n):
            node = queue.pop(0)
            if i < n - 1:
                node.next = queue[0]
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)

    return root

以上就是本题的两种解法,其中迭代的方法在面试中会更容易写出,但是递归的写法更为简洁,掌握两种方法都是非常必要的。

相关文章