Day15 | 二叉树

56 阅读2分钟

102. 二叉树的层序遍历

  • 单调队列
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:

    if not root:
        return []

    queue = [root]
    res = []

    while queue:
        n = len(queue)
        tmp = []
        while n:
            node = queue.pop(0)
            if node:
                tmp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            n -= 1
        res.append(tmp)

    return res
  • 递归
def traversal(node, d):
    if not node:
        return

    if len(res) == d:
        res.append([])

    res[d].append(node.val)
    traversal(node.left, d+1)
    traversal(node.right, d+1)

相关:

107. 二叉树的层序遍历 II

    return res[::-1]

199. 二叉树的右视图

def rightSideView(self, root: Optional[TreeNode]) -> List[int]:

    if not root:
        return []

    queue = [root]
    res = []

    while queue:
        n = len(queue)
        tmp = []
        while n:
            node = queue.pop(0)
            if node:
                tmp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            n -= 1
        res.append(tmp[-1])

    return res

637. 二叉树的层平均值

def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:

    if not root:
        return []

    queue = [root]
    res = []

    while queue:
        n = len(queue)
        i = n
        ave = 0
        while n:
            node = queue.pop(0)
            if node:
                ave += node.val
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            n -= 1
        res.append(ave/i)

    return res

429. N 叉树的层序遍历

def levelOrder(self, root: 'Node') -> List[List[int]]:

    if not root:
        return []

    queue = [root]
    res = []

    while queue:
        n = len(queue)
        tmp = []
        while n:
            node = queue.pop(0)
            if node:
                tmp.append(node.val)
                if node.children:
                    for child in node.children:
                        queue.append(child)
            n -= 1
        res.append(tmp)
    return res

515. 在每个树行中找最大值

def largestValues(self, root: Optional[TreeNode]) -> List[int]:
    
    if not root:
        return []

    queue = [root]
    res = []

    while queue:
        n = len(queue)
        tmp = []
        maximum = - inf
        while n:
            node = queue.pop(0)
            if node:
                maximum = max(maximum, node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            n -= 1
        res.append(maximum)

    return res

116. 填充每个节点的下一个右侧节点指针

&

117. 填充每个节点的下一个右侧节点指针 II

def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':

    if not root:
        return root

    queue = [root]
    res = []

    while queue:
        n = len(queue)
        tmp = []
        for i in range(n):
            node = queue.pop(0)
            if node:
                tmp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            if i == n - 1:
                break
            node.next = queue[0]

        res.append(tmp)

    return root

深度问题

104. 二叉树的最大深度

def maxDepth(self, root: Optional[TreeNode]) -> int:
    if not root:
        return 0

    queue = [root]
    depth = 0

    while queue:
        n = len(queue)
        tmp = []
        while n:
            node = queue.pop(0)
            if node:
                tmp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            n -= 1
        depth += 1

    return depth

最小深度

#根节点的深度为1
    queue_ = [(root,1)]
    while queue_:
        cur, depth = queue_.pop(0)

        if cur.left == None and cur.right == None:
            return depth
        #先左子节点,由于左子节点没有孩子,则就是这一层了
        if cur.left:
            queue_.append((cur.left,depth + 1))
        if cur.right:
            queue_.append((cur.right,depth + 1))

    return 0

226. 翻转二叉树

  • 迭代法
def invertTree(self, root: TreeNode) -> TreeNode:
    # 前序遍历
    if not root:
        return None
    root.left, root.right = root.right, root.left #中
    self.invertTree(root.left) #左
    self.invertTree(root.right) #右
    return root
def invertTree(self, root: TreeNode) -> TreeNode:
    # 后序遍历
    if root is None:
        return None
    self.invertTree(root.left)
    self.invertTree(root.right)
    root.left, root.right = root.right, root.left
    return root 

101. 对称二叉树

判断左右子树是否相等