填充每個節點的下一個右側節點指針 II

迭代方法,(遇到了一個超長的測試用例,結果超時了。。。。。):

"""
# 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章