55 - I. 二叉树的深度
comments: true
difficulty: 简单
edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9855%20-%20I.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%B7%B1%E5%BA%A6/README.md
面试题 55 - I. 二叉树的深度
题目描述
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3/ \9 20/ \15 7
返回它的最大深度 3 。
提示:
节点总数 <= 10000
注意:本题与主站 104 题相同:https://leetcode.cn/problems/maximum-depth-of-binary-tree/
解法
方法一:递归
我们可以用递归的方法来解决这道题。递归的终止条件是当前节点为空,此时深度为 0 0 0;如果当前节点不为空,则当前的深度为其左右子树深度的最大值加 1 1 1,递归计算当前节点的左右子节点的深度,然后返回它们的最大值加 1 1 1。
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)。其中 n n n 是二叉树的节点数。最坏情况下,二叉树退化为链表,递归深度达到 n n n,系统使用 O ( n ) O(n) O(n) 大小的栈空间。
Python3
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = Noneclass Solution:def maxDepth(self, root: TreeNode) -> int:if root is None:return 0return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
Java
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
class Solution {public int maxDepth(TreeNode root) {if (root == null) {return 0;}return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));}
}
C++
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {if (!root) {return 0;}return 1 + max(maxDepth(root->left), maxDepth(root->right));}
};
Go
/*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/
func maxDepth(root *TreeNode) int {if root == nil {return 0}l, r := maxDepth(root.Left), maxDepth(root.Right)if l > r {return 1 + l}return 1 + r
}
Rust
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
use std::cell::RefCell;
use std::rc::Rc;
impl Solution {pub fn max_depth(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {match root {None => 0,Some(node) => {let mut node = node.borrow_mut();let left = node.left.take();let right = node.right.take();1 + Self::max_depth(left).max(Self::max_depth(right))}}}
}
JavaScript
/*** Definition for a binary tree node.* function TreeNode(val) {* this.val = val;* this.left = this.right = null;* }*/
/*** @param {TreeNode} root* @return {number}*/
var maxDepth = function (root) {if (!root) {return 0;}return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
};
C#
/*** Definition for a binary tree node.* public class TreeNode {* public int val;* public TreeNode left;* public TreeNode right;* public TreeNode(int x) { val = x; }* }*/
public class Solution {public int MaxDepth(TreeNode root) {if (root == null) {return 0;}return 1 + Math.Max(MaxDepth(root.left), MaxDepth(root.right));}
}
Swift
/* public class TreeNode {
* public var val: Int
* public var left: TreeNode?
* public var right: TreeNode?
* public init(_ val: Int) {
* self.val = val
* self.left = nil
* self.right = nil
* }
* }
*/class Solution {func maxDepth(_ root: TreeNode?) -> Int {guard let root = root else {return 0}return 1 + max(maxDepth(root.left), maxDepth(root.right))}
}