代码随想录刷题|LeetCode 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数(上)

简介: 代码随想录刷题|LeetCode 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

104.二叉树的最大深度

题目链接:力扣

思路

       1、求高度使用的是后序遍历

后序遍历:(左右中)是一种自上而下的方法,根节点想知道自己的最大告诉的时候,让左右子树去统计,左右子树让分别让自己的左右子树去统计,以此类推。叶子节点下面的空节点返回来说自己是0,叶子节点加上自己的1返回给父节点,父节点再去比较自己左右节点的最大值


      2、求深度使用的是前序遍历


       前序遍历:(中左右)是一种自上而下的方法


       但是这道题目让我们求的是二叉树的最大深度,根节点的高度其实就是二叉树的最大深度,这是这道题目的关键所在,那么我们就可以使用后序遍历求出最大深度


二叉树的最大深度

后序遍历求根的最大高度(递归法)

       第一步:确定参数类型和返回值
       第二步:确定终止条件
       第三步:确定单层的逻辑(按照左右中的顺序进行处理)

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftHeight = maxDepth(root.left); // 左子树的最大高度
        int rightHeight = maxDepth(root.right); // 右子树的最大高度
        int maxHeight = 1 + Math.max(leftHeight,rightHeight); // 得到中间节点的最大深度
        return maxHeight;
    }
}

前序遍历求最大深度(递归法)

       采取中左右的前序遍历 涉及回溯思想

class Solution {
  /**
   * 递归法(求深度法)
   */
    //定义最大深度
    int maxnum = 0;
    public int maxDepth(TreeNode root) {
        ans(root,0);
        return maxnum;
    }
    //递归求解最大深度
    void ans(TreeNode tr,int tmp){
        if(tr==null) return;
        tmp++;
        maxnum = maxnum<tmp?tmp:maxnum;
        ans(tr.left,tmp);
        ans(tr.right,tmp);
        tmp--;
    }
}
// 分解写法
class Solution {
    int result;
    public int maxDepth(TreeNode root) {
        result = 0;
        if (root == null) {
            return result;
        }
        getDepth(root,1);
        return result;
    }
    public void getDepth (TreeNode root, int depth) {
        result = depth > result ? depth : result; //中
        if (root.left == null && root.right == null) {
            return;
        }
        if (root.left != null) {                 // 左
            depth++;
            getDepth(root.left,depth);
            depth--;
        }
        if (root.right != null) {                 // 右
            depth++;
            getDepth(root.right,depth);
            depth--;
        }
        return;
    }
}

迭代法求最大深度(迭代法)

       迭代法可以使用层序遍历,循环一层深度加1就可以了,最大深度就是二叉树的层数

       迭代法也是一种自上而下的思路,从上往下一层一层去记录


class Solution {
    public int maxDepth(TreeNode root) {
        int depth = 0;
        if (root == null) {
            return depth;
        }
        // 创建队列
        Deque<TreeNode> deque = new LinkedList<>();
        // 将根节点添加进队列
        deque.offer(root);
        // 开始层序遍历
        while (!deque.isEmpty()) {
            // 获取当前节点的个数
            int len = deque.size();
            // 此时队列不为空,说明这一层是存在的,深度+1
            depth++;
            // 将这一层的节点弹出,同时将下一层的节点添加进来
            for (int i = 0; i < len; i++) {
                TreeNode node = deque.poll();
                if (node.left != null) {
                    deque.offer(node.left);
                }
                if (node.right != null) {
                    deque.offer(node.right);
                }
            }
        }
        return depth;
    }
}

559.n叉树的最大深度

题目链接:力扣

思路

       是求二叉树的最大深度的扩展

n叉树的最大深度

递归法

  原理和二叉树的最大深度的后序遍历法一样


       如果根节点有N个子节点,则这N个子节点对应N个子树。记N个子树的最大深度的最大值为maxChildDepth,则该N叉树的最大深度为maxChildDepth + 1

       每个子树的最大深度又可以通过同样的方式进行计算,因此可以采用【深度优先搜索】的方法计算

       在计算当前N叉树的最大深度时,可以先递归计算出其每个子树的最大深度,然后再计算出当前N叉树的最大深度

       递归访问到空节点结束


class Solution {
    public int maxDepth(Node root) {
        if (root == null) {
            return 0;
        }
        int maxChildDepth = 0;
        if (root.children != null) {
            for (Node child : root.children) {
                maxChildDepth = Math.max(maxChildDepth,maxDepth(child));
            }
        }
        return maxChildDepth + 1;
    }
}

迭代法

       层序遍历

class Solution {
    public int maxDepth(Node root) {
        if (root == null) {
            return 0;
        }
        // 创建队列
        Deque<Node> deque = new ArrayDeque<>();
        // 将根节点添加到队列中
        deque.offer(root);
        // 定义深度
        int depth = 0;
        // 开始层序遍历
        while (!deque.isEmpty()) {
            // 获取当前层数的节点个数
            int len = deque.size();
            // 弹出此层节点,添加对应的孩子节点
            while (len-- > 0) {
                Node node = deque.poll();
                for (Node child : node.children) {
                    deque.offer(child);
                }
            }
            depth++;
        }
        return depth;
    }
}
相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
17 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
18 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
16 0
|
3月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
58 7