代码随想录训练营 day16| 第六章 二叉树part03

LeetCode 104. 二叉树的最大深度

解题思路

        二叉树的 最大深度 是指 从根结点到最远叶子结点的最长路径上的结点数。这里区分两个概念:

  1. 二叉树结点的深度: 指从根结点到该结点的最长简单路径边的条数或者结点数;
  2. 二叉树结点的高度: 指从该结点到叶子结点的最长简单路径边的条数或者结点数;

所以根结点的高度就是二叉树的最大深度。

        使用递归法可以使用前序遍历(中左右), 也可以使用后序遍历(左右中)。其中使用前序求的是深度,使用后续求得是高度。

使用后序遍历计算树的高度流程:

  1. 参数是传入树的根结点,返回的是这棵树的深度(int 型);
  2. 如果为空结点,返回0,表示高度为0;
  3. 递归逻辑: 先求左子树的深度,再求右子树的深度,最后取左、右深度最大的数值,并加上1;

        当然,本题也可以考虑使用层序遍历来解决,每有一层,深度加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 getDepth(TreeNode * node)
    {
        if(node == nullptr)
        return 0;

        int left = getDepth(node->left);
        int right = getDepth(node->right);

        return 1+ max(left, right);
    }

    int maxDepth(TreeNode* root) {

        return getDepth(root);

    }
};

LeetCode 111. 二叉树的最小深度

解题思路

        最小深度是指根结点到最近叶子结点的最短路径上的结点数量, 注意是叶子结点。因此本题与最大深度不同的是, 最近的叶子结点不一定在最后一层。

        所以,如果左子树为空,右子树不为空,说明最小深度是 1+右子树的深度; 反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。如果左、右子树都不为空,返回左、右子树深度的最小值 +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 getDepth(TreeNode * node)
    {
        if(node == nullptr)
        {
            return 0;
        }

        if(node->left !=nullptr && node->right == nullptr)
        return 1+getDepth(node->left);
        else if(node->left == nullptr && node->right !=nullptr)
        return 1 + getDepth(node->right);

        else if(node->left == nullptr && node->right == nullptr)
        return 1;

        int leftDepth = getDepth(node->left);
        int rightDepth = getDepth(node->right);

        return 1 + min(leftDepth ,rightDepth);

    }

    int minDepth(TreeNode* root) {

        return getDepth(root);

    }
};

LeetCode 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 getNodes(TreeNode * node)
    {
        // if(node->left == nullptr && node->right == nullptr)
        // {
        //     return 1;
        // }
        if(node == nullptr)
        {
            return 0 ;
        }

        return 1 + getNodes(node->left) + getNodes(node->right);
    }

    int countNodes(TreeNode* root) {

        if(root == nullptr)
        return 0;

        return getNodes(root);

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值