迭代方法,(遇到了一个超长的测试用例,结果超时了。。。。。):
"""
# Definition for a Node.
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
"""
class Solution:
def connect(self, root):
def connectFunc(root: 'Node') -> 'Node': #作用是对于节点返回其子节点中靠左的那个,如果实在没找到,会找root.next的子节点
if root is None: return None
if root.left is not None and root.right is not None:
root.left.next = root.right
if root.next is not None:
root.right.next = connectFunc(root.next)
else:
pass
connectFunc(root.left)
connectFunc(root.right)
return root.left
elif root.left is None and root.right is None:
if root.next is not None:
return connectFunc(root.next)
else:
return
elif root.left is None:
if root.next is not None:
root.right.next = connectFunc(root.next)
else:
pass
connectFunc(root.right)
return root.right
elif root.right is None:
if root.next is not None:
root.left.next = connectFunc(root.next)
else:
pass
connectFunc(root.left)
return root.left
connectFunc(root)
return root
迭代方法:
仍旧是颜色法进行遍历:
"""
# Definition for a Node.
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
"""
class Solution:
def connect(self, root):
white = 1
gray = 0
level = 0
stack = [(white, root, level),]
res = []
while stack:
color, r, level = stack.pop()
if color:
if r is None: continue
stack.append((white, r.right, level + 1))
stack.append((white, r.left, level + 1))
stack.append((gray, r, level))
else:
if res.__len__() < level + 1:
res.append(r)
else:
res[level].next = r
res[level] = r
return root
使用popleft的横向遍历法:
"""
# Definition for a Node.
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
"""
from collections import deque
class Solution:
def connect(self, root):
if root is None:
return
stack = deque([root])
while stack:
p = Node(0)
n = len(stack)
for i in range(n):
r = stack.popleft()
if r.left:
stack.append(r.left)
if r.right:
stack.append(r.right)
p.next = r
p = p.next
p.next = None
return root