如何计算 N叉树的最大深度

news/2024/7/7 19:12:54 标签: 深度优先, 宽度优先, 算法, 递归法

文章目录

  • 题目简述
    • TreeNode代码
  • DFS
  • BFS

LeetCode-559

题目简述

给定一个N叉树,找到其最大深度
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

TreeNode代码

class Node {
	//值
    public int val;
    //孩子结点 使用List集合存储
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
}

我们简单的分析一下N叉树:
N叉树存储叶子节点的方式和二叉树不同
从代码中很清除的可以看到N叉树的孩子节点用一个List集合存储

DFS

我们可以使用深度优先搜索解决这个问题。

思路:
以二叉树为例。
我们可以递归的计算结点左子树和右子树的深度,得到较大的子树深度,然后加一,即可得到本结点的深度。

比如我们要计算根结点的深度getDepth(root),则只需要计算 Math.max(getDepth(root.left),getDepth(root.right))+1即可,而左子树的深度又又可以由左子树的左子树和右子树的最大深度加一得到,递归的解决此问题。

如果不够清晰,可看代码

代码实现:



class Solution {
    public int maxDepth(Node root) {
         return getDepth(root);

    }
	//此方法用于得到数的深度
     public int getDepth(Node root){
     //如果结点为null 则返回0
        if (root==null){
            return 0;
        }
        
        //得到子结点链表
        List<Node> nodes = root.children;
        //这个遍历用于记录子树的最大深度
        int ans = 0;
        //遍历每个结点得到具有最大深度的子结点
        for (Node n : nodes){
            ans = Math.max(ans,getDepth(n));
        }
        
        //返回结果
        return ans+1;
    }
}

BFS

广度优先搜索也是一个不错的选择

思路:

树的深度就是其对应的层数,我们可以不可以这样子,每当我们遍历一层,将让ans+1,当遍历完最后一层,ans就是我们所需要的结果。

我们利用一个队列来存储叶子节点,每次遍历一层,用一个变量来存储这一层结点的多少,当变量当前层的结点的时候,将下一层的结点存入队列,当最后队列为空时,就遍历完了所有的层数,即可得到树的层数,即树的深度。

不懂可以参考代码

代码:



class Solution {
    public int maxDepth(Node root) {
         if (root==null){
              return 0;
          }
			//用来存储结点的队列
          Queue<Node> queue = new LinkedList<>();
		//记录层数 没遍历完一层 ans+1
          int ans = 0 ;
          //将根节点加入队列
          queue.add(root);
		//当队列为空时 结束循环  每一次循环就是遍历其中的一层
          while (!queue.isEmpty()){
              //一层一层遍历
              //size 用来记录当前层 的结点个数
              int size = queue.size();
			//用while循环来控制遍历本层结点的个数
              while (size>0){
              //得到结点
                  Node node = queue.poll();
                  //得到子结点 即下一层的结点
                  List<Node> list = node.children;
                  //将结点存入队列中
                  queue.addAll(list);
                  //控制本层剩余的结点个数
                    size--;
              }
              //遍历完一层 ans+1
              ans++;
          }
          //while循环结束 则将树的所有层 都遍历过了 返回结果
          return ans;

    }
}

http://www.niftyadmin.cn/n/1440853.html

相关文章

springboot09 事务 H2数据库

一、事务 1. 事务介绍 事务可以包含多个操作步骤 &#xff0c; 如果有一个步骤失败&#xff0c;那么这一组都以失败告终。 事务是指包含多个微小逻辑单元的一组操作&#xff0c; 只要其中有一个逻辑失败了&#xff0c;那么这一组操作就全部以失败告终&#xff0c;不存在一半成功…

保护SQL Server数据库的十大绝招(转)

1. 安装最新的服务包    为了提高服务器安全性&#xff0c;最有效的一个方法就是升级到SQL Server 2000 Service Pack 3a (SP3a)。另外&#xff0c;您还应该安装所有已发布的安全更新。   2. 使用Microsoft基线安全性分析器&#xff08;MBSA&#xff09;来评估服务器的安全…

Java高并发程序设计(九)--ThreadLocal

如果说锁是让线程有序的争夺资源的话&#xff0c;那么ThreadLocal就是让每个线程都有一份资源。 打个比方&#xff0c;锁是让一百个人争夺一只笔区写字&#xff0c;ThreadLocal就是一百个人每人都有一只笔&#xff0c;在轮到他们写字的时候写。 写个简单的例子&#xff1a; pub…

关闭端口防止病毒与黑客入侵(转)

你的系统是不是1XP SP1&#xff0c;但是安装了2005瑞星杀毒软件后总是提示系统有 MS-4011 Exploit 和Blaster Rpc Exploit 两个漏洞。。。。。。。    最直接的办法&#xff0c;把系统不用的端口都关闭掉&#xff0c;然后从新启动&#xff0c;如果瑞星还提示有漏洞攻击&…

移动通信概要(转)

摘要&#xff1a;移动通信网在世纪之交正以前所未有的高速度发展。本文扼要探讨其现状与展望&#xff0c;简要介绍蜂窝移动通信网、卫星移动通信网和移动数据通信网的技术应用及其演进情况。关键词&#xff1b;移动通信 GSM CDMA卫星通信 CDPD GPRS一、引言当前全球移动通信正以…

实例解析:高效率网吧组网解决方案(转)

目前国内最为常见的网吧网络规模在100台电脑到400台电脑之间。考虑到此类网吧网络的建设已形成规模&#xff0c;中心选择高性能的全千兆交换机形成一个千兆的交换网络是十分必要的。同时考虑到为确保整个网络的高效率使用&#xff0c;全网配置提供丰富管理功能的可网管交换机也…

数据库设计的三大范式

简介 为了建立冗余较小&#xff0c;结构合理的数据库&#xff0c;设计数据库时必须遵守一定的规则&#xff0c;在关系型数据库中这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系型数据库中的关系必须满足一定的要求&#xff0c;即满足不同的范式。 目前关系型…

如何防范短信接口被恶意调用(被刷)

鉴于之前遇到过短信接口被刷的问题&#xff0c;解决的不是很好。现发现一篇如此高质量博客&#xff0c;特此收藏分享~ 一、什么是短信轰炸&#xff08;短信接口被刷&#xff09; 短信轰炸一般基于 WEB 方式(基于客户端方式的原理与之类似)&#xff0c;由两个模块组成&#xff0…