Day 16 | 二叉树

77 阅读1分钟

掌握递归法在二叉树中的应用

104. 二叉树的最大深度

  • 递归法

判断左右子树长度 选择较长的

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

    def depth(root, d):
        if not root:
            return d
        ld = depth(root.left, d+1)
        rd = depth(root.right, d+1)
        d = max(ld, rd)
        return d
    
    return depth(root,0)
  • 迭代法
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

559. N 叉树的最大深度

  • 递归法

注意返回值和遍历过程中深度改变的方式

def maxDepth(self, root: 'Node') -> int:
    if not root:
        return 0

    def depth(root, d):
        if not root:
            return d
        d = 0
        for c in root.children:
            d = max(d, depth(c, d))
        return d + 1
    
    return depth(root,0)
  • 迭代法
def maxDepth(self, root: 'Node') -> 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.children:
                    for c in node.children:
                        queue.append(c)
            n -= 1
        depth += 1

    return depth

111. 二叉树的最小深度

  • 递归法

【参照随想录】

思考如何排除1的结果(一边子树为空)

def minDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        if not root.left and not root.right:
            return 1

        min_depth = 10**9
        if root.left:
            min_depth = min(self.minDepth(root.left), min_depth) # 获得左子树的最小高度
        if root.right:
            min_depth = min(self.minDepth(root.right), min_depth) # 获得右子树的最小高度
        return min_depth + 1
  • 迭代法
def minDepth(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)
            if not node.left and not node.right:
                return depth + 1
            n -= 1
        depth += 1

    return depth

222. 完全二叉树的节点个数

层序遍历统计节点个数

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

    """
    :type root: TreeNode
    :rtype: int
    """
    d = 0
    stack = [root]

    while stack:
        node = stack.pop()
        if node:
            d += 1
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)

    return d

层序相关迭代法总结

其实就是构建队列 逐层访问树

根据题目要求的不同调整返回值