1 问题描述

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

示例 1:

二叉树最大深度java 二叉树最大深度代码_结点


输入: root = [1,None,2,3]


输出: 3

示例 2:

输入: root = []
输出: 0

示例 3:

输入: root = [1]
输出: 1

示例 4:

二叉树最大深度java 二叉树最大深度代码_子树_02


输入: root = [1,2]


输出: 2

示例 5:

二叉树最大深度java 二叉树最大深度代码_子树_03


输入: root = [1,None,2]


输出: 2

初始代码

二叉树最大深度java 二叉树最大深度代码_二叉树_04

二叉树最大深度java 二叉树最大深度代码_子树_05

from typing import List
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def list_to_binarytree(nums):
    if nums==[]:return 
    b=root=TreeNode(nums[0])
    a=[]
    i=1
    while i < len(nums):
        if nums[i]:
            root.left=TreeNode(nums[i])
            a.append(root.left)
        if i+1<len(nums):
            if nums[i+1]:
                root.right=TreeNode(nums[i+1])
                a.append(root.right)
        i+=2
        root=a.pop(0)
    return b


root = list_to_binarytree([1,None,2,3,None,4,5,6,7,8])

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        #在此填写代码

print(Solution().maxDepth(list_to_binarytree([1,None,2,3])))
print(Solution().maxDepth(list_to_binarytree([])))
print(Solution().maxDepth(list_to_binarytree([1])))
print(Solution().maxDepth(list_to_binarytree([1,2])))
print(Solution().maxDepth(list_to_binarytree([1,None,2])))

View Code

2 解题思路

  • 要求最大深度1,可以求出每条树枝的长度,最终取出最大值
  • 当节点为None时,深度为0
  • 若有子树,则子树头结点深度加1,直到没有子树为止

#3 解题方法

二叉树最大深度java 二叉树最大深度代码_二叉树_04

二叉树最大深度java 二叉树最大深度代码_子树_05

from typing import List
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def list_to_binarytree(nums):
    if nums==[]:return 
    b=root=TreeNode(nums[0])
    a=[]
    i=1
    while i < len(nums):
        if nums[i]:
            root.left=TreeNode(nums[i])
            a.append(root.left)
        if i+1<len(nums):
            if nums[i+1]:
                root.right=TreeNode(nums[i+1])
                a.append(root.right)
        i+=2
        root=a.pop(0)
    return b

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root :return 0
        else:
            return max(self.maxDepth(root.right),self.maxDepth(root.left)) +1

print(Solution().maxDepth(list_to_binarytree([1,None,2,3])))
print(Solution().maxDepth(list_to_binarytree([])))
print(Solution().maxDepth(list_to_binarytree([1])))
print(Solution().maxDepth(list_to_binarytree([1,2])))
print(Solution().maxDepth(list_to_binarytree([1,None,2])))

View Code

第1-26,31-35行: 题目中已经给出的信息,运行代码时要根据这些代码进行编辑(具体为创建二叉树以及列表、二叉树转换)
第27行: 若此节点为None返回深度为0
第28行: 对此节点左子树、右子树深度进行比较,此时已经有源节点所以深度加1,选出左右子树的深度最大值(左右子树深度是递归得来的)

代码运行结果为:

二叉树最大深度java 二叉树最大深度代码_二叉树最大深度java_08

#结构讲解

这里用到了基础结构:二叉树,简单讲解下这个二叉树:

链表

二叉树(Binary tree)是树形结构的一个重要类型。

许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。

二叉树最大深度java 二叉树最大深度代码_子树_09


二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

结点:包含一个数据元素及若干指向子树分支的信息

结点的度:一个结点拥有子树的数目称为结点的度

叶子结点:也称为终端结点,没有子树的结点或者度为零的结点

分支结点:也称为非终端结点,度不为零的结点称为非终端结点

树的度:树中所有结点的度的最大值

结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层

树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度

有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树

序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树

森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根结点删除,则该树就变成了一片森林,森林中的树由原来根结点的各棵子树构成