迭代方法,(遇到了一個超長的測試用例,結果超時了。。。。。):
"""
# 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