力扣练习:104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

第十六天的这三道题其实样子很一样。

不论是层序遍历抑或是递归的方法。

层序呢,就是一层一层的往里面叠加,但是叠加的方法可能稍有不同。

求二叉树的最大深度时

        第一层while下放depth++, 最终就可以得到最大深度。

求二叉树的最小深度时,

         一定要注意:最小的深度的定义: 从根节点到叶子结点,并且这个叶子结点是一个没有子节点的节点。所以依旧是depth++; 但是一旦出现了某个 cur->left == null && cur-.right == NULL 此时就可以返回了

求完全二叉树的节点个数: 

        这个呢其实很简单,就是在第二层不断count++;就可以了。


int getNodes(struct TreeNode* root) {
    if (root == NULL) return 0;
    int leftNodes = getNodes(root->left);
    int rightNodes = getNodes(root->right);
    return 1 + leftNodes + rightNodes;
}
int countNodes(struct TreeNode* root) {
    if (root == NULL) return 0;
    return getNodes(root);
}

        

int countNodes(struct TreeNode* root){
    if (root == NULL) return 0;
    struct TreeNode* queueData[50001];
    struct TreeNode* cur;
    int queueRear = 0, queueFront = 0;
    queueData[queueRear++] = root;
    int count = 0;
    while(queueRear != queueFront) {
        int last = queueRear;
        while (last != queueFront) {
            cur = queueData[queueFront++];
            count++;
            if (cur->left != NULL) {
                queueData[queueRear++] = cur->left;
            }
            if (cur->right != NULL) {
                queueData[queueRear++] = cur->right;
            }
        }
    }
    return count;
}

递归:一定要清楚递归的三部曲,1.确定函数的参数和返回值2. 确定终止条件(这个就是root == null) 3. 确定单层递归的逻辑。

三个题其实代码几乎一样,就是在子函数中返回什么东西需要注意

这里要最小深度的特殊之处,返回值一定要是某个节点没有子节点 。 否则那就返回另一节点的 1+ 高度

int minDepth(struct TreeNode* root) {
    if (root == NULL) return 0;
    int leftDepth = minDepth(root->left);
    int rightDepth = minDepth(root->right);
    if (root->left == NULL && root->right != NULL) {
        return 1 + rightDepth;
    }
    else if (root->left != NULL && root->right == NULL) {
        return 1 + leftDepth;
    }
    int result = 1 + fmin(leftDepth, rightDepth);
    return result;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值