Python中链表的将二叉树每层的节点连接起来操作
题目描述
给定一颗二叉树,将每层的节点按照从左到右的顺序连接起来,最终形成一个链表,返回链表的头节点。
例如:给定二叉树为:
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
以上就是本题的两种解法,其中迭代的方法在面试中会更容易写出,但是递归的写法更为简洁,掌握两种方法都是非常必要的。
相关文章