力扣日记11.27-【二叉树篇】二叉树的最大深度

力扣日记:【二叉树篇】二叉树的最大深度

日期:2023.11.27
参考:代码随想录、力扣

104. 二叉树的最大深度

题目描述

难度:

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

力扣日记11.27-【二叉树篇】二叉树的最大深度_第1张图片

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 10^4] 区间内。
  • -100 <= Node.val <= 100

题解

递归法(cpp ver)
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    // 递归法:后序遍历 (实际上是求高度)
    // 1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根的树的深度
    int getdepth(TreeNode* node) {  
        // 2. 确定终止条件:如果为空节点的话,就返回0,表示高度为0。
        if (node == NULL) return 0;
        // 3. 确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。
        int leftdepth = getdepth(node->left);       // 左(左子树的高度)
        int rightdepth = getdepth(node->right);     // 右(右子树的高度)
        int depth = 1 + max(leftdepth, rightdepth); // 中(左子树和右子树的根节点的高度, 包括根节点, 故+1)
        return depth;
    }
    int maxDepth(TreeNode* root) {
        return getdepth(root);
    }
};
迭代法(go ver)
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxDepth(root *TreeNode) int {
    // 使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合
    queue := list.New()
    maxDepth := 0
    
    if root != nil {
        queue.PushBack(root)
    }
    for queue.Len() > 0 {
        // 记录当前队列长度
        size := queue.Len()

        for size > 0 {
            // 弹出并写入结果
            front := queue.Front()
            node := queue.Remove(front).(*TreeNode) // 存进list之后类型会变为*list.Element,要转换为*TreeNode
            // 左右节点入队列
            if node.Left != nil {
                queue.PushBack(node.Left)
            }
            if node.Right != nil {
                queue.PushBack(node.Right)
            }
            size -= 1
        }
        maxDepth += 1
    }
    return maxDepth
}

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 本题如果用迭代法,则直接使用层序遍历的模板解题即可
  • 如果用递归法,则相对难一些:
    • 首先要理解二叉树的深度高度区别:
      • 二叉树节点的深度:指从根节点该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)—— 即深度是从某节点角度往上(根节点)看的
      • 二叉树节点的高度:指从该节点叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)—— 即高度是从某节点角度往下(叶子节点)看的
      • 因此,根节点的高度就是二叉树的最大深度
    • 本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,即最大的叶子节点深度,使用后序求的是高度,即根节点的高度。(后序遍历相对容易理解一些,见代码)

你可能感兴趣的:(leetcode,算法,职场和发展)