1
# Runtime: 305 ms (Top 5.46%) | Memory: 15.4 MB (Top 49.03%)3
# Definition for a Node.5
def __init__(self, val=0, left=None, right=None, next=None):13
class Solution(object):14
def findRightMost(self, root, level, requiredLevel):17
if level == requiredLevel:19
right = self.findRightMost(root.right, level + 1, requiredLevel)22
return self.findRightMost(root.left, level + 1, requiredLevel)24
def findLeftMost(self, root, level, requiredLevel):27
if level == requiredLevel:29
left = self.findLeftMost(root.left, level + 1, requiredLevel)32
return self.findLeftMost(root.right, level + 1, requiredLevel)34
def findRightMostFromRoot(self, rootLevelInfo, requiredLevel, currentRight):36
if currentRight.right:37
return currentRight.right39
return currentRight.left40
root, rootlevel = rootLevelInfo41
rightMost = self.findRightMost(root, rootlevel, requiredLevel)42
while not rightMost and root:43
root = root.right if root.right else root.left45
rightMost = self.findRightMost(root, rootlevel, requiredLevel)47
rootLevelInfo[-1] = rootlevel48
rootLevelInfo[0] = root51
def findLeftMostFromRoot(self, rootLevelInfo, requiredLevel, currentLeft):54
return currentLeft.left56
return currentLeft.right57
root, rootlevel = rootLevelInfo58
leftMost = self.findLeftMost(root, rootlevel, requiredLevel)59
while not leftMost and root:60
root = root.left if root.left else root.right62
leftMost = self.findLeftMost(root, rootlevel, requiredLevel)64
rootLevelInfo[-1] = rootlevel65
rootLevelInfo[0] = root69
def stitch(self, root):72
leftRootStart = [root.left, 1]73
rightRootStart = [root.right, 1]75
currentLeft = self.findLeftMostFromRoot(rightRootStart, 1, None)76
currentRight = self.findRightMostFromRoot(leftRootStart, 1, None)77
while currentLeft and currentRight:78
currentRight.next = currentLeft80
currentLeft = self.findLeftMostFromRoot(81
rightRootStart, connectLevel, currentLeft83
currentRight = self.findRightMostFromRoot(84
leftRootStart, connectLevel, currentRight87
self.stitch(root.left)88
self.stitch(root.right)90
def connect(self, root):