首页 > 编程语言 >代码随想录算法训练营第十六天 | 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

代码随想录算法训练营第十六天 | 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

时间:2024-05-25 17:30:12浏览次数:24  
标签:return int 随想录 E5% 二叉树 深度 root getMaxHeight

104.二叉树的最大深度

题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/
文档讲解:https://programmercarl.com/0104.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%A4%A7%E6%B7%B1%E5%BA%A6.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解:https://www.bilibili.com/video/BV1Gd4y1V75u

思路

  • 之前用层序遍历做过最大深度的题。现在换递归的方法。
  • 后序遍历:根节点的高度就是二叉树的最大深度,而高度是从下往上慢慢累加上去的,所以用的是后序遍历(左右中)。
  • 前序遍历:代码会比后序遍历复杂一些。从上往下深度依次增加。用了深度回溯,等我学了回溯再回来补起。

代码

class Solution {
    public int maxDepth(TreeNode root) {
        return getMaxHeight(root);
    }

    public int getMaxHeight(TreeNode root) {
        if (root == null) return 0;
        int leftHeight = getMaxHeight(root.left);
        int rightHeight = getMaxHeight(root.right);
        int height = 1 + Math.max(leftHeight, rightHeight);
        return height;
    }
	// getMaxHeight()的精简写法,不定义leftHeight和rightHeight,直接写到return里面。
	public int getMaxHeight(TreeNode root) {
        if (root == null) return 0;
        return 1 + Math.max(getMaxHeight(root.left), getMaxHeight(root.right));
    }
}

559.n叉树的最大深度

题目链接:https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/

思路

和二叉树不一样的是,需要先遍历每一个孩子的下的深度,每次遍历都和最大深度相比较。

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

    public int getMaxHeight(Node root) {
        if (root == null) return 0;
        int max = 0;
        for (Node child : root.children) {
            int childHeight = getMaxHeight(child);
            max = Math.max(childHeight, max);
        }
        return 1 + max;
    }
}

111.二叉树的最小深度

题目链接:https://leetcode.cn/problems/minimum-depth-of-binary-tree/
文档讲解:https://programmercarl.com/0111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解:https://www.bilibili.com/video/BV1QD4y1B7e2

思路

  • 这道题同样也可以用层序遍历解出。下面是递归法。
  • 也是用后序遍历来解决。但在求出左右子树的深度之后,不能直接比较选最小值。因为如果根节点左子树为空,右子树深度为2,那这样算出来根节点最小深度就是1 + 0了。在这部分要分情况来选择。

代码

class Solution {
    public int minDepth(TreeNode root) {
        return getMaxHeight(root);
    }

    public int getMaxHeight(TreeNode root) {
        if (root == null) return 0;
        int leftHeight = getMaxHeight(root.left);
        int rightHeight = getMaxHeight(root.right);
        // 当左子树为空,就选择右子树的高度。
        if (root.left == null && root.right != null) return 1 + rightHeight;
        // 当右子树为空,就选择左子树的高度。
        else if (root.left != null && root.right == null) return 1 + leftHeight;
        // 如果两边都不为空,就选最小高度。
        return 1 + Math.min(leftHeight, rightHeight);
    }
}

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

题目链接:https://leetcode.cn/problems/count-complete-tree-nodes/
文档讲解:https://programmercarl.com/0222.%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%8A%82%E7%82%B9%E4%B8%AA%E6%95%B0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解:https://www.bilibili.com/video/BV1eW4y1B7pD

思路

  • 如完全二叉树的特点是,除了底层节点,上面的结点都是满的,而底层节点从左到右一次排开,中间不能有剩余。所以虽然这道题可以用二叉树的各种遍历方法解决,但是最好是使用完全二叉树的特性进行解决。
  • 通过遍历左侧和右侧的深度,来判断该子树是否为满二叉树,如果是满二叉树,节点个数就是2n - 1 个。

代码

class Solution {
    public int countNodes(TreeNode root) {
        return getCount(root);
    }

    public int getCount(TreeNode root) {
        if (root == null) return 0;
        // 满二叉树也是一个终止条件
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftCount = 0, rightCount = 0;
        while (left != null) {
            leftCount++;
            left = left.left;
        }
        while (right != null) {
            rightCount++;
            right = right.right;
        }
        if (leftCount == rightCount) return (2 << leftCount) - 1; 

        return 1 + getCount(root.left) + getCount(root.right);
    }
}

标签:return,int,随想录,E5%,二叉树,深度,root,getMaxHeight
From: https://blog.csdn.net/Danny_8/article/details/139176325

相关文章

  • Java数据结构与算法(平衡二叉树)
    前言平衡二叉树是为了提高二叉树的查询速度,通过满足特定的条件来保持其平衡性。平衡二叉树具有以下特点:左子树和右子树的高度差不会大于1,这是为了确保树的高度不会过大,从而减少查询时的磁盘I/O开销,提高查询速度。平衡二叉树上的所有结点的平衡因子(左子树深度减去右子树深度的......
  • 深度神经网络详解
    一、引言深度神经网络(DeepNeuralNetworks,DNNs)是机器学习中的一种重要模型,近年来在图像识别、自然语言处理、语音识别等领域取得了显著的成果。深度神经网络通过模拟人脑神经元的工作方式,利用层级结构对输入数据进行抽象和特征提取,从而实现复杂的模式识别和数据分析。本文......
  • 代码随想录算法训练营第36期DAY38
    DAY38435无重叠区间昨晚很快就想出来了,今天相当于二刷。class Solution {public:    static bool mycmp(vector<int>&a,vector<int>&b){        return a[1]<b[1];    }    int eraseOverlapIntervals(vector<vector<int>>& intervals) {   ......
  • 代码随想录算法训练营第36期DAY39
    道心破碎的一天,继续加油吧,坚持努力。DAY39738单调递增的数字暴力法:没有想到用inti=n;i>0;i--来遍历。class Solution {private:    bool checknum(int num){        if(num<10) return true;        while(num/10!=0){           ......
  • 代码随想录算法训练营第36期DAY37
    DAY37先二刷昨天的3道题目,每种方法都写:是否已完成:是。报告:134加油站的朴素法没写对。原因是:在if中缺少了store>=0的判断,只给出了index==i的判断。前进法没写出来。因为忘记了总油量的判断。Sum。注意变量的初始化。分配糖果注意if里面放的是ratings;860柠檬水找零网上摘得思......
  • 二叉树前中后序遍历
    前言个人小记一、代码如下#include<stdio.h>#include<stdlib.h>#include<time.h>#defineMAX_NODE10#definep()\{\printf("\n");\}typedefstructNode{intkey;intlfag,rfag;structNode*lchild,*rchild;}Node;......
  • 代码随想录——二叉树的所有路径(Leetcode257)需要回顾
    题目链接BFS+队列维护一个队列,存储节点以及根到该节点的路径。一开始这个队列里只有根节点。在每一步迭代中,我们取出队列中的首节点,如果它是叶子节点,则将它对应的路径加入到答案中。如果它不是叶子节点,则将它的所有孩子节点加入到队列的末尾。当队列为空时广度优先搜......
  • (读后总结)深度解析机器学习(全6册)萃取自然语言与智能图像处理的经验 (卡蒂克·雷迪·
    链接:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqso提取码:jqso机器学习基础:介绍了机器学习的基本概念、分类以及发展历程,为后续章节奠定了理论基础。深度学习原理:详细讲解了深度学习的原理、架构以及优化方法,为自然语言处理和图像处理提供了强大的技术支持。自然语言处理......
  • 深度学习笔记03_pytorch实现天气识别
    ......
  • 算法学习笔记——深度优先搜索DFS 2024.5.25
    LanqiaoOJ141此题是一道比较经典的搜索题目,这里采用深度优先搜索的方法题目描述X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?......