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

【104.二叉树的最大深度】

https://programmercarl.com/0104.二叉树的最大深度.html二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度_哔哩哔哩_bilibili这题可以使用递归法和迭代法来解决。

递归法:

重点:二叉树根节点的高度就是二叉树的最大深度

求二叉树的高度使用的是后续遍历的方式。(左右中)

递归法三部曲:

1.确定参数及返回值

int getDepth(TreeNode* node){};

2. 确定递归的边界条件

if(node == NULL) return 0;

3.确定递归的逻辑

int leftDepth = getDepth(node->left);
int rightDepth = getDepth(node->right);
int depth = max(leftDepth, rightDepth);
return depth + 1;

整体的代码如下:

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

【111.二叉树的最小深度】

https://programmercarl.com/0111.二叉树的最小深度.html

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

最小深度这道题目的关键在于,再使用递归解题的时候,中间的逻辑需要单独处理

左子树空单右子树非空:返回值是右子树的最小深度+1

右子树空单左子树非空:返回值是左子树的最小深度+1

这两种情况。

当左右子树都非空的时候,返回的是左右子树的最小深度的最小值+1;

这三个条件都遍历完成,就是所有的情况都考虑到了。

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

https://programmercarl.com/0222.完全二叉树的节点个数.html#_222-完全二叉树的节点个数

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

这题涉及到完全二叉树的特点,那就是子树一定是由满二叉树所构成的。而满二叉树的节点个数的计算公式是「2的N次方-1」,其中N为满二叉树的深度。

当使用递归的时候,牢记递归三部曲。

1.确定递归的参数和返回值

int countNodes(TreeNode* root)

2.确定递归的终止条件

当根节点为NULL的时候,返回0

当子树为满二叉树的时候,返回2^N-1。满二叉树的条件是一直往左边遍历的深度等于一直往右边便利的深度。

if (root == nullptr) return 0; 
// 开始根据做深度和有深度是否相同来判断该子树是不是满二叉树
TreeNode* left = root->left;
TreeNode* right = root->right;
int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
while (left) {  // 求左子树深度
    left = left->left;
    leftDepth++;
}
while (right) { // 求右子树深度
    right = right->right;
    rightDepth++;
}
if (leftDepth == rightDepth) {
    return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,返回满足满二叉树的子树节点数量
}

3.确定单层递归逻辑

单层递归逻辑是二叉树后续遍历的逻辑。

左边的节点值等于左子树求节点,右边节点的值为右子树求节点,中间节点的值为左右相加再加1。

int leftTreeNum = countNodes(root->left);       // 左
int rightTreeNum = countNodes(root->right);     // 右
int result = leftTreeNum + rightTreeNum + 1;    // 中
return result;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值