剑指offer38_二叉树的深度_题解

二叉树的深度

题目描述

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

示例1

输入

{1,2,3,4,5,#,6,#,#,7}

返回值

4

分析

方案一:递归

此树的深度=左子树的深度与右子树的深度中的最大值 +1。

代码

/**
1.时间复杂度:O(n)
N 为树的节点数量,计算树的深度需要遍历所有节点。
2.空间复杂度:O(n)
最差情况下(当树退化为链表时),递归深度可达到 N 。
**/
class Solution
{
public:
    int TreeDepth(TreeNode *pRoot)
    {
        if (!pRoot)
        {
            return 0;
        }
        return 1 + max(TreeDepth(pRoot->left), TreeDepth(pRoot->right));
    }
};

方案二:层序遍历

代码

/**
1.时间复杂度 O(N): N 为树的节点数量,计算树的深度需要遍历所有节点。
2.空间复杂度 O(N): 最差情况下(当树平衡时),队列 queue 同时存储 N/2 个节点。
**/
class Solution
{
public:
    int TreeDepth(TreeNode *pRoot)
    {
        if (!pRoot)
            return 0;
        queue<TreeNode *> q;
        q.push(pRoot);

        int level = 0;
        while (!q.empty())
        {
            int sz = q.size();
            while (sz--)
            {
                auto node = q.front();
                q.pop();
                if (node->left)
                    q.push(node->left);
                if (node->right)
                    q.push(node->right);
            }
            level += 1;
        }
        return level;
    }
};
posted @ 2021-01-13 17:41  RiverCold  阅读(71)  评论(0编辑  收藏  举报