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

文档讲解:代码随想录

视频讲解:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度_哔哩哔哩_bilibili

看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度_哔哩哔哩_bilibili 

要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量_哔哩哔哩_bilibili


第十五天,二叉树部分还是挺多的,继续打卡继续开练!

104.二叉树的最大深度

思路:采用一个后序遍历,当然是利用递归,这题中根节点的高度也是二叉树的最大深度。总的来说还是很容易实现的

class solution{
public:
    int getDepth(TreeNode* node){
        if(node == NULL) return 0;
        int leftdepth = getDepth(node->left);
        int rightdepth = getDepth(node->right);
        int depth = 1 + max(node->left, node->right);
        return depth;
    }
    int maxDpeth(TreeNode* root){
        getDepth(root);
        return root;
    }
};

111.二叉树的最小深度

思路:跟上题比较类似,但因为我们要求的是最小深度,所以在处理中间节点也就是父节点的时候需要进行判断,而不能直接根据哪个子树高度最低返回对应的值。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。,注意是叶子节点。而左右孩子为空的节点才是叶子节点。

class solution{
public:
    int getHight(TreeNode* node){
        if(node == NULL) return 0;
        int lefthight = getHight(node->left);
        int righthight = getHight(node->right);
        if(node->left == NULL && node->right != NULL){
            return righthight + 1;
        }
        if(node->left != NULL && node->right == NULL){
            return lefthight + 1;
        }
        int result = 1 + min(lefthight, righthight);
        return result;
    }

    int minHight(TreeNode* root){
        get(root);
        return root;
    }
};

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

思路:首先得明白完全二叉树的概念,要么是满二叉树,要么就是叶子节点没填满。其次我们要注意的是递归出口的处理判断,判断是否为满二叉树我们只需要遍历每个子树的最左侧节点数量和最右侧节点数量,如果相等即为满二叉树。最后通过公式,即完全二叉树满足总节点数为2的高度减一次方那么多。

class solution{
public:
    int getNum(TreeNode* node){
        if(node == NULL) return 0;
        int left = node->left;
        int right = node->right;
        int leftdepth = 0, rigthdepth = 0;
        while(left){
            left = left->left;
            leftdepth++;
        }
        while(right){
            right = right->right;
            rightdepth++;
        }
        if(leftdepth == rightdepth) return (2 << leftdepth) - 1;
    }
    int leftnum = getNum(node->left);
    int rightnum = getNum(node->right);
    int result = leftnum + rightnum + 1;
    return result;
};

总结:又写到这个时候,近晚上十一点,不知道付出到底有没有收获,只能继续撑着。陌生人,共勉。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值