LeetCode初级算法之树:104 二叉树最大深度

 

 

01

题目信息

题目地址:

https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

 

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

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3 。

 

02

概述

 

树的开篇第一题其实也是比较简单的,但它的目的是让我们初步认识树这样一个结构。二叉树每个节点有两个子节点也就是两个指针。大概结构如下:

public class TreeNode {
    //节点内容值
    int val;
    //两个指针
    TreeNode left;
    TreeNode right;
    //构造方法
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

 

03

解法一:深度优先搜索(DFS)

 

递归的想法,最大深度 = 1 + Max( L0(left) , L0(right))。而每个子树再找到它最大的深度。下图就是这样一个过程,图中省略一些东西只画了一部分理解这样一个思路就ok

9757f19a-f094-4f15-aff4-d02ec78fb130.gif

public int maxDepth(TreeNode root) {
    if(root == nullreturn 0; // 递归出口  
    return Math.max(this.maxDepth(root.left), this.maxDepth(root.right)) + 1;
}

088ebbb4-bf28-4f06-b48a-fa5b1df46bce.png


04

解法二:广度优先搜索(BFS)

 

上面是递归,这里是迭代的方式,输入root节点判断是否存在存在则深度+1,再判断下一层节点(输入1层两个节点)对一个节点判断有无子节点,无则出,有则把它的子节点先加进来再出,注意这里是一个先进先出的关系(排队)因为是一层一层的遍历完

c5b3fca9-d0e8-418a-b572-12b81e93527a.gif

public int maxDepth(TreeNode root) {
    if (root == nullreturn 0;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    int result = 0;
    while (!queue.isEmpty()) {
    //每层每个节点的遍历
        for(int i = quene.size(); i > 0; i--){
            TreeNode node = queue.poll();
            if (node.left != null) queue.offer(node.left);
            if (node.right != null) queue.offer(node.right);
        }
        result++;
    }
    return result;
}

6115542a-1545-4175-a459-d48eb1207d8e.png

 

05

总结

 

合集中树的第一题,总体来说熟悉树的基本结构体会遍历的操作

 

本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值