117. 填充每个节点的下一个右侧节点指针 II
https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/
解法一:层序
和116题一样的代码
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
解法二:递归
注意不能前序,应该先递归处理右子树再左。因为每次处理root时得用到root.next的信息,所以必须先对右侧处理。
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root:
return root
#若有左子,且有右子,则左子连接右子
#无右子,则左子连接父亲右侧的左(或右)子
if root.left:
if root.right:
root.left.next = root.right
else:
next = root.next
while next:
if next.left:
root.left.next = next.left
break
if next.right:
root.left.next = next.right
break
next = next.next #无子则进入下一个
#若有右子,连接父亲右侧的左(或右)子
if root.right:
next = root.next
while next:
if next.left:
root.right.next = next.left
break
if next.right:
root.right.next = next.right
break
next = next.next
#先递归右子树,再递归左子树
root.right = self.connect(root.right)
root.left = self.connect(root.left)
return root
最后更新于