leetcode 104.二叉树的最大深度(maximum depth of binary tree)C语言

leetcode 104.二叉树的最大深度(maximum depth of binary tree)C语言

1.description

https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/description/

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

⁠ 3
⁠ /
⁠ 9 20
⁠ /
⁠ 15 7

返回它的最大深度 3 。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

2.solution

2.1 递归:

int maxDepth(struct TreeNode* root){
    int lhigh = 0;
    int rhigh = 0;

    if(root == NULL){
        return 0;
    }

    lhigh = maxDepth(root->left);
    rhigh = maxDepth(root->right);

    return (lhigh > rhigh) ? (lhigh + 1) : (rhigh + 1); 
}

2.2 BFS迭代

基于链表队列:

#define queue_is_empty(queue) (queue->head == NULL)

typedef struct list_node{
    void *val;
    struct list_node *next;
}Node;

typedef struct list_queue{
    Node *head;
    Node *tail;
    int size;
}Queue;


// 创建初始队列
Queue *queue_create(){
    Queue *queue = NULL;
    queue = (Queue*)malloc(sizeof(Queue));
    if(queue == NULL){
        return NULL;
    }

    queue->head = NULL;
    queue->tail = NULL;
    queue->size = 0;

    return queue;
}


// 入队
void enqueue(Queue *queue, void *val){
    Node *node = NULL;
    node = (Node*)malloc(sizeof(Node));
    node->val = val;
    node->next = NULL;

    if(queue_is_empty(queue)){
        queue->head = node;
    }else{
        queue->tail->next = node;
    }
    queue->tail = node;
    (queue->size)++;
}


// 出队
int dequeue(Queue *queue, void **val){
    if(queue_is_empty(queue)){
        return -1;
    }

    *val = queue->head->val;
    Node *p = queue->head;
    queue->head = p->next;

    // ***如果出队的是最后一个节点,记得把tail置为NULL
    if(queue->head == NULL){
        queue->tail = NULL;
    }

    (queue->size)--;

    free(p);
    return 0;
}

int maxDepth(struct TreeNode* root){
    if(root == NULL){
        return 0;
    }

    Queue *queue = NULL;
    struct TreeNode *node = NULL;
    queue = queue_create();

    enqueue(queue, (void*)root);

    int level = 0;
    while(!queue_is_empty(queue)){
        int levelid = 0;
        int size = queue->size;
        while(size--){
            dequeue(queue, (void*)&node);

            if(node->left){
                enqueue(queue, (void*)node->left);
            }
            if(node->right){
                enqueue(queue, (void*)node->right);
            }
        }
        level++;
    }

    free(queue);

    return level;
}

基于数组队列:

// 基于数组队列的BFS迭代法
#define MAX_LEN 10000

int maxDepth(struct TreeNode* root){
    if(root == NULL){
        return 0;
    }

    struct TreeNode *queue[MAX_LEN];
    struct TreeNode *p = NULL;
    int head = 0;
    int tail = 0;
    int num = 0;

    queue[tail++] = root;
    num++;

    int level = 0;
    while(num != 0){ // 队不空
        int size = num; // 记录当前层节点个数
        while(size--){
            // 出队
            p = queue[head];
            head++;
            num--;

            // 子节点入队
            if(p->left){
                queue[tail++] = p->left;
                num++;
            }
            if(p->right){
                queue[tail++] = p->right;
                num++;
            }
        }
        level++;
    }

    return level;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值