求二叉树的最大、最小深度

27 篇文章 0 订阅
17 篇文章 0 订阅
这篇博客介绍了如何计算二叉树的最大深度和最小深度,分别提供了递归和非递归的解决方案。最大深度使用了层序遍历的方法,而最小深度则通过考虑叶子节点的位置来确定。递归解法简洁,非递归解法涉及队列操作。博客中详细解释了队列操作以及时间复杂度和空间复杂度的分析。
摘要由CSDN通过智能技术生成

1、描述

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

例如:

给定二叉树 [3,9,20,null,null,15,7],

3

/
9 20
/
15 7
返回它的最大深度 3

来源:力扣(LeetCode)
求二叉树的最大深度
求二叉树的最小深度
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2、关键字

二叉树,求深度

3、思路

层序遍历,两层while循环,
思路2:递归

4、notes

queue的入队列,是que.push();,出队列是que.pop();

que.push();
que.pop();
que.pop_front();// ???,没有这玩意!!!!

外层循环是队列非空,内层循环是次数是当前层元素的个数。
1、图的广度优先就是树的层序遍历的推广
3、广度优先遍历的代码结构第一层while()判断是否为空,第二层while()判断 一层是否结束
2、queueSTL不熟悉,
queue入队,如例:q.push(x); 将x 接到队列的末端。

queue出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。

访问queue队首元素,如例:q.front(),即最早被压入队列的元素。

访问queue队尾元素,如例:q.back(),即最后被压入队列的元素。

判断queue队列空,如例:q.empty(),当队列空时,返回true。

访问队列中的元素个数,如例:q.size()

5、复杂度

时间: O(mlogh),m是叶子节点个数,h是树高度
空间:O(m),只要一个变量存结果,还需要一个队列的长度m,最多元素的那一层。

6、code

最大深度:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

// 最大深度:方法2:递归
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(!root) return 0;
        return max(maxDepth(root->left), maxDepth(root->right)) + 1;
    }
};


// 最大深度: 方法1:
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root == nullptr) return 0;
        int res = 0;  // 这里初始化为0,不能为1,不然是多的 !
        queue<TreeNode*>que;
        que.push(root);
        while(!que.empty()){
            int nn = que.size();
            while(nn--){
                auto tem = que.front();
                // que.pop_front();  // 这里怎么写来着???
                que.pop();
                if(tem->left){
                    que.push(tem->left);
                }
                if(tem->right){
                    que.push(tem->right);
                }
            }            
            res++;
        }
        return res;
    }
};

二叉树的最小深度

/**
 * 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 minDepth(TreeNode* root) {
        if(!root) return 0;
        else if(!root->left) return minDepth(root->right) + 1;
        else if(!root->right) return minDepth(root->left) + 1;
        else return min(minDepth(root->left),minDepth(root->right)) + 1;
    }
};


// 最小深度 非递归层序遍历,队列,
class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<TreeNode*>qu;  // 树的队列
        if(root==NULL) return 0;  // 如果根节点为空,直接返回
        qu.push(root);
        int res=1;  // 记录结果
        while(!qu.empty())  // 不为空
        {
            int queNum=qu.size();    // 一层的数量      
            while(queNum--)  // 此一层的操作
            {
                auto tem=qu.front();   // 取此一层队列的第一个元素 
                qu.pop();  // 此为队列删除队首元素            
                if(tem->left==NULL)  // 判断左子树是否为空,此条件下两种情况,后边else有两种情况
                {
                    //qu.push(tem->left);
                    if(tem->right==NULL)  // 如果右子树也是空,即为叶子节点
                    return res;
                    else  // 右子树不为空
                    qu.push(tem->right);
                }
                else  // 左子树不为空
                {
                    qu.push(tem->left);  // 左子树直接进队列
                    if(tem->right!=NULL)  // 判断右子树也得不为空才进队列
                    qu.push(tem->right);
                }                            
            }
            res++;
        }
        return res;       
    }
};



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值