DAY16(104.二叉树最大深度,111.二叉树最小深度,222.完全二叉树的节点个数)

什么是二叉树的高度和深度

深度:根节点到某个节点的路径(从上往下)

高度:叶子节点到某个节点的路径(从下往上)

104.二叉树最大深度

题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)

解题思路:二叉树的最大深度就等于二叉树的最大高度,所以这题能够转求二叉树的最大高度来解题。采用递归的思想,某个节点的最大高度等于他的左右孩子节点中最大高度+1,即采用后序遍历能够完成操作。

代码实现:

class Solution {
public:
    int getdepth(TreeNode* node){
        if(node == NULL)return 0;
        int leftdepth = getdepth(node->left);
        int rightdepth = getdepth(node->right);
        int max_depth = 1+max(leftdepth,rightdepth);
        return max_depth;
    }
    int maxDepth(TreeNode* root) {
        return getdepth(root);
    
    }
};

同样能够使用层序遍历来实现,即层数就是最大深度。

代码实现:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root == NULL) return 0;
        queue<TreeNode*>que;
        int depth = 0;
        que.push(root);
        while(!que.empty()){
            depth++;
            int size = que.size();
            for(int i = 0;i<size;i++){
                TreeNode* node = que.front();
                que.pop();
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
            }
        }
        return depth;
    }
};

111.二叉树的最小深度

题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)

解题思路:这题与第一题其实相似,只是按照题目要求,当根节点的左右孩子其中一个为空的时候,最小深度不能为1,而是不为空的那个子树的最小深度+1。同样使用递归的思想就能实现。

class Solution {
public:
    int getdepth(TreeNode *node){
        if(node == NULL) return 0;
        int leftdepth = getdepth(node->left);
        int rightdepth = getdepth(node->right);
        if(node->left == NULL && node->right != NULL){//左孩子为空
            return 1+rightdepth;
        }
        if(node->right == NULL && node->left !=NULL){//右孩子为空
            return 1+leftdepth;
        }
        int result = 1 +min(leftdepth,rightdepth);
        return result;
    }
    int minDepth(TreeNode* root) {
        return getdepth(root);
    }
};

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

题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)

解题思路:这题直接使用递归就能实现,某个总的节点数=左子树节点数+右子树节点数+1。

代码实现:

class Solution {
public:
    int getnum(TreeNode* node){
        if(node == NULL)return 0;
        int leftnum = getnum(node->left);
        int rightnum = getnum(node->right);
        int total_num = leftnum + rightnum +1;
        return total_num;
    }
    int countNodes(TreeNode* root) {
        return getnum(root);

    }
};

(ps:目前只掌握了有关递归的题解,其余题解后续补充)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值