JZ55 二叉树的深度

167 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

Day28 2023/02/04

题目链接

难度:简单

题目

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。

数据范围:节点的数量满足 0≤n≤100 ,节点上的值满足 0≤val≤100

进阶:空间复杂度 O(1) ,时间复杂度 O(n)

假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:

示例

输入:{1,2,3,4,5,#,6,#,#,7}
返回值:4

思路


可以使用递归的思路,本题让我们求二叉树的深度(即从根节点到叶节点依次经过的节点形成的路径中最长的那一条路径的长度),这个深度就等于根节点这一层再加上它的左子树和右子树深度的最大值,而左子树和右子树又可以分别再看作两棵二叉树,求它们的深度也是同理。因此求二叉树的的深度可以划分为若干子问题,故使用递归。
具体实现:

  1. 对每个节点来说递归出口为节点为空。
  2. 分别递归计算左右子数的深度,返回较大的哪一方并加1。
    如图所示:

912E54FDA2FC2312AE3F1E8387E0C1B6.gif

知识点


  • 递归思想它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能将原本的问题分解为更小的子问题,这是使用递归的关键。

算法实现


c++代码实现-递归法

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
  public:
    int TreeDepth(TreeNode* pRoot) {
        if (!pRoot) return 0; //递归出口
        int numl = TreeDepth(pRoot->left); //递归调用
        int numr = TreeDepth(pRoot->right);
        return numl > numr ? numl + 1 : numr + 1; //返回深度更大的路径长度
    }
};

  • 时间复杂度 O(n)O(n) --- 遍历整棵二叉树,n为节点个数
  • 空间复杂度 O(n)O(n) --- 最坏情况下二叉树为链表型,这时递归栈深度为节点个数n

总结

  • 这题还可以使用辅助队列的方式,实现层序遍历同样的方式,只不过记录一下遍历的层数即为二叉树深度。
  • 但这题进阶要求空间复杂度为O(1)O(1),时间复杂度为O(n)O(n),目前还没想到什么好方法,会的大佬可以评论一下。