【代码随想录算法训练营第十六天|104.二叉树的最大深度 、 111.二叉树的最小深度、 222.完全二叉树的节点个数】

代码随想录算法训练营第十六天|104.二叉树的最大深度 、 111.二叉树的最小深度、 222.完全二叉树的节点个数

思路代码来自y总:http://www.acwing.com

104.二叉树的最大深度

我是一看就会,一写就费。先看代码:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(!root) return 0;
        return max(maxDepth(root->left),maxDepth(root->right)) + 1;
    }
};

这道题看起来代码非常简单,但是能用递归写出来,就很难,我最近发现递归的代码别看简洁,但是都很难想。这道题目就是上来了判断根节点,然后返回左右子树哪个层数更多一点,最后+1,加的是根节点。

111.二叉树的最小深度

先看代码:

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root) return 0;
        if(root->left && root->right) return min(minDepth(root->left),minDepth(root->right)) + 1;
        if(root->left && !root->right) return minDepth(root->left) + 1;
        return minDepth(root->right) + 1;
    }
};

看到这道题目,很多人是不是跟我一样,按着二叉树的最大深度算的,哈哈哈,恭喜入坑,因为最小和最大不一样的是,如果按最大值的写法写最小值就是比较左右子树谁更小,按道理说没有什么问题,但是又有特例,如果某个二叉树只有一边难道最小的是没有的那一边吗?难道是1?所以,最大最小的关键就在这个特例里,所以除了基本的判断根节点,还要单独判断一边,最后判断两边都有的情况。

222.完全二叉树的节点个数

class Solution {
public:
    int countNodes(TreeNode* root) {
        int sum = 0;
        if(!root) return 0;
        if(root && !root->left && !root->right) return 1;
        queue<TreeNode*> q;
        q.push(root);
        while(q.size())
        {
            int len = q.size();
            sum += len;
            while(len--)
            {
                TreeNode* t = q.front();
                q.pop();
                if(t->left) q.push(t->left);
                if(t->right) q.push(t->right);
            }
        }
        return sum;
    }
};

这道题目我用层次遍历,也就是广度优先遍历做的,换汤不换药,不过这里我要反思,我本来做这道题目的时候层次遍历已经写过5道题目了,这道题目居然写错模板了,真的是不该,每次TreeNode* t = q.front();都应该再while循环里,这样每次一个元素出队才有其左右子树进队。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值