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

LeetCode 104.二叉树的最大深度

题目链接:104.二叉树的最大深度

踩坑:先看了视频,需要辨析的就是树的高度(节点到叶子节点的距离)和深度(节点到根节点的距离)

思路:这是一道用层序遍历解决过的问题。在此是为了练习递归。使用后序遍历可以求解高度,而根节点的高度恰恰就是最大深度,若使用前序遍历求解深度,则无法直接得到(根节点的深度为1)。

代码:

/**
 * 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:
    int maxDepth(TreeNode* root) {
        if(root == nullptr) return 0;

        int left = maxDepth(root->left);
        int right = maxDepth(root->right);
        int height = 1+max(left, right);
        return height;
    }
};

LeetCode 111.二叉树的最小深度

题目链接:111.二叉树的最小深度

踩坑:与求解二叉树的最大深度相比,并不是将返回值由max变为min就简单解决了的

思路:求解最小深度的核心就是对叶节点的判断,如果是将求最大深度代码的max改为min,意味着如果当前节点的一个子树为空,另一个不为空,那么该节点的高度会被认为是1,即被认为是叶节点。所以,应该对两个子树的不同情况做不同处理。PS:这道题同样也是可以用层序遍历可以解决滴,也是在遍历过程中发现当前节点的两个子树都为空,返回当前层数即可。

代码:

/**
 * 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:
    int minDepth(TreeNode* root) {
        if(root == nullptr) return 0;

        int left = minDepth(root->left);
        int right = minDepth(root->right);

        if(left == 0 || right == 0) return 1+left+right;
        else return 1+min(left, right);
    }
};

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

题目链接:222.完全二叉树的节点个数

踩坑:先看了视频,无坑

思路:随便使用任意一种遍历都可以解决这道题,但是这样就相当于忽视了完全二叉树这一特性。对于完全二叉树来说,其中必定存在一个满二叉子树,而满二叉树的节点个数可以直接使用 2 n − 1 2^n-1 2n1求得。所以可以尝试确定完全二叉树中的满二叉树。在完全二叉树中,给定一个根节点,判断其是否为满二叉树可以通过不断向左延申和向右延申,如果左右深度相等说明是满二叉树,此时根节点可以直接根据深度返回节点个数。

代码:

/**
 * 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:
    int countNodes(TreeNode* root) {
        if(root == nullptr) return 0;
        TreeNode* left = root->left;
        TreeNode* right = root->right;
        int left_depth = 0;
        int right_depth = 0;
        while(left)
        {
            left = left->left;
            left_depth++;
        }
        while(right)
        {
            right = right->right;
            right_depth++;
        }
        if(left_depth == right_depth) return (2<<left_depth)-1;

        return countNodes(root->left)+countNodes(root->right)+1;
    }
};
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值