104. 二叉树的最大深度

问题描述

  • 给定一个二叉树,找出其最大深度。
  • 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
  • 说明: 叶子节点是指没有子节点的节点。
示例1:
输入:给定二叉树 [3,9,20,null,null,15,7]
    3
   / \
  9  20
    /  \
   15   7
输出:返回它的最大深度 3 。

题目来源:LeetCode官方
链接地址:https://leetcode.cn/problems/maximum-depth-of-binary-tree/

思路

直接递归遍历,分别获取左子树深度与右子树深度,返回较大的变量即可

核心代码

    public static int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //灵魂在于maxDepth函数return语句的+1,有了它,在遍历二叉树的时候层数才会不断叠加
        //这种写法会超时,因为相当于要递归四次(每一个递归函数相当于一次)
        //return maxDepth(root.left) > maxDepth(root.right) ? maxDepth(root.left) + 1 : maxDepth(root.right) + 1;
        //这个写法就只递归了两次,节省了时间
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return left > right ? left + 1 : right + 1;
    }

代码解释

分别获取左子树高度,与右子树高度,然后返回最大的,递归的理解就是将整个二叉树看成三个部分:根结点、左结点、右结点,然后根据题目意思对这三部分做相应处理

运行效果

无

完整源代码

package com.easy;

public class maxDepth {
    public static void main(String[] args) {
        /**
         * 构建二叉树
         *      1
         *   2    3
         *  4 5  6
         */
        TreeNode n4 = new TreeNode(4);
        TreeNode n5 = new TreeNode(5);
        TreeNode n6 = new TreeNode(6);
        TreeNode n2 = new TreeNode(2, n4, n5);
        TreeNode n3 = new TreeNode(3, n6, null);
        TreeNode root = new TreeNode(1, n2, n3);

        System.out.println(maxDepth(root));
        System.out.println(count_deep(root));

    }

    //DFS
    public static int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //灵魂在于maxDepth函数return语句的+1,有了它,在遍历二叉树的时候层数才会不断叠加
        //这种写法会超时,因为相当于要递归四次(每一个递归函数相当于一次)
        //return maxDepth(root.left) > maxDepth(root.right) ? maxDepth(root.left) + 1 : maxDepth(root.right) + 1;
        //这个写法就只递归了两次,节省了时间
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return left > right ? left + 1 : right + 1;
    }

    //两种写法都差不多
    public static int count_deep(TreeNode root) {
        if (root == null) return 0;
        int left = count_deep(root.left) + 1;
        int right = count_deep(root.right) + 1;

        return left > right ? left : right;
    }
}

运行截图

无

### C++ 实现计算二叉树最大深度 #### 方法一:递归法(深度优先遍历) 递归方法利用函数调用来模拟栈的行为,从而简化代码逻辑。此方法通过比较左子树和右子树的高度并返回较大者加一作为当前节点的高度。 ```cpp int maxDepth(TreeNode* root) { if (root == nullptr) return 0; int leftHeight = maxDepth(root->left); int rightHeight = maxDepth(root->right); return std::max(leftHeight, rightHeight) + 1; // 计算高度差并加上根节点本身的高度 } ``` 这种方法的优点在于其简洁性和易读性[^2]。然而,在处理特别深的二叉树时可能会遇到栈溢出的风险,因为每次递归都会占用一定的内存空间用于保存上下文信息[^1]。 #### 方法二:迭代法(广度优先遍历) 为了克服递归可能带来的性能问题,可以采用基于队列的数据结构来进行层次遍历。这种方式不会受到系统默认的最大递归层数限制的影响,并且能够更直观地理解每一层的增长情况。 ```cpp #include <queue> int maxDepth(TreeNode* root) { if (!root) return 0; std::queue<TreeNode*> q; q.push(root); int depth = 0; while (!q.empty()) { ++depth; for (size_t i = q.size(); i > 0; --i) { TreeNode *node = q.front(); q.pop(); if (node->left != nullptr) q.push(node->left); if (node->right != nullptr) q.push(node->right); } } return depth; } ``` 这段代码展示了如何使用标准库中的`std::queue`容器来辅助完成宽度优先搜索过程。每当一层的所有节点都被访问过后,计数器便会增加一次,最终得出整棵树的最大深度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值