116. 填充每个节点的下一个右侧节点指针
https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/
解法一:层序
对每层结点,前后连接起来即可
"""
# Definition for a Node.
class Node:
def __init__(self, val, left, right, next):
self.val = val
self.left = left
self.right = right
self.next = next
"""
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root:
return root
queue = [root]
while queue:
last = None #记录同一层前一个结点,初始为空
for _ in range(len(queue)):
node = queue.pop(0)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
if last:
last.next = node
last = node
return root
解法二:递归
前序遍历(后序也可以)
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root: #出口
return
#若有左子,则也有右子(满二叉树)
if root.left:
root.left.next = root.right #左连接右
#右子连接父亲兄弟结点的左子(若存在)
root.right.next = root.next.left if root.next else None
#递归左右子树(前序)
self.connect(root.left)
self.connect(root.right)
return root
也可以到叶节点就返回,不用每次都递归到空节点
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root: #出口
return
if not root.left: #叶节点直接返回(若有左子,则也有右子(满二叉树)
return root
root.left.next = root.right #左连接右
#右子连接父亲兄弟结点的左子(若存在)
root.right.next = root.next.left if root.next else None
#递归左右子树(前序
self.connect(root.left)
self.connect(root.right)
return root
最后更新于