117.填充每个节点的下一个右侧节点指针II、104.二叉树的最大深度、111.二叉树的最小深度

题目链接/文章讲解/视频讲解: 代码随想录

1.117.填充每个节点的下一个右侧节点指针II

1.1分析及思路

和116.填充每个节点的下一个右侧节点指针是一样的,我们都用队列,一层一层的指。前n-1个都指向其队列后面的元素。

1.2代码及注释

typedef struct Node ElemType;  // 定义结构体 Node 为 ElemType
#define MaxSize 6001  // 定义队列的最大容量为 6001
 
typedef struct {
    ElemType* data[MaxSize];  // 存储元素的数组
    int size;  // 队列当前元素个数
    int front, rear;  // 队列头尾指针
} SqQueue;

void InitQueue(SqQueue* Queue) {
    Queue->rear = Queue->front = 0;  // 初始化队列头尾指针
    Queue->size = 0;  // 初始化队列元素个数为 0
}
 
bool isEmpty(SqQueue Queue) {
    if (Queue.rear == Queue.front)  // 判断队列是否为空
        return true;
    return false;
}
 
bool GetTopQueue(SqQueue Queue, ElemType** x) {
    if ((Queue.size == 0) || (Queue.rear == Queue.front))  // 判断队列是否为空或已满
    return false;
    
    *x = Queue.data[Queue.front];  // 获取队首元素
    return true;
}
 
bool EnQueue(SqQueue* Queue, ElemType* x) {
    if ((Queue->rear + 1) % MaxSize == Queue->front)  // 判断队列是否已满
        return false;
    
    Queue->data[Queue->rear] = x;  // 入队
    Queue->rear = (Queue->rear + 1) % MaxSize;  // 更新 rear 指针
    Queue->size++;  // 更新队列元素个数
    return true;
}
 
bool DeQueue(SqQueue* Queue, ElemType** data) {
    if ((Queue->size == 0) || (Queue->rear == Queue->front))  // 判断队列是否为空
        return false;
    
    *data = (*Queue).data[Queue->front];  // 出队
    Queue->front = (Queue->front + 1) % MaxSize;  // 更新 front 指针
    Queue->size--;  // 更新队列元素个数
    return true;
}
 
struct Node* connect(struct Node* root) {
    if(root == NULL)  // 判断根节点是否为空
        return NULL;
    
    SqQueue Queue;  // 定义队列
    InitQueue(&Queue);  // 初始化队列
    EnQueue(&Queue,root);  // 根节点入队
 
    while(!isEmpty(Queue)){  // 遍历队列中的节点
        int QueueLen = Queue.size;  // 获取当前队列长度
        struct Node* Node = NULL;  // 定义节点指针
        for(int i=0;i<QueueLen;i++){  // 遍历当前队列中的节点
            DeQueue(&Queue,&Node);  // 出队一个节点
            if (i < QueueLen - 1)  // 如果不是最后一个节点
                Node->next = Queue.data[Queue.front];  // 直接连接下一个节点
            if(Node->left != NULL)  // 如果左子节点不为空
                EnQueue(&Queue,Node->left);  // 左子节点入队
            if(Node->right != NULL)  // 如果右子节点不为空
                EnQueue(&Queue,Node->right);  // 右子节点入队
        }
    }
    return root;  // 返回根节点
}

2.104.二叉树的最大深度

2.1分析及思路

与上几个题目类似,这个就相当于求的是层数,有几层就是就是树的深度。

2.2代码及注释

typedef struct Node ElemType;  // 定义结构体 Node 为 ElemType
#define MaxSize 10001  // 定义队列的最大容量为 10001
 
typedef struct {
    ElemType* data[MaxSize];  // 存储元素的数组
    int size;  // 队列当前元素个数
    int front, rear;  // 队列头尾指针
} SqQueue;

void InitQueue(SqQueue* Queue) {
    Queue->rear = Queue->front = 0;  // 初始化队列头尾指针
    Queue->size = 0;  // 初始化队列元素个数为 0
}
 
bool isEmpty(SqQueue Queue) {
    if (Queue.rear == Queue.front)  // 判断队列是否为空
        return true;
    return false;
}
 
bool GetTopQueue(SqQueue Queue, ElemType** x) {
    if ((Queue.size == 0) || (Queue.rear == Queue.front))  // 判断队列是否为空或已满
    return false;
    
    *x = Queue.data[Queue.front];  // 获取队首元素
    return true;
}
 
bool EnQueue(SqQueue* Queue, ElemType* x) {
    if ((Queue->rear + 1) % MaxSize == Queue->front)  // 判断队列是否已满
        return false;
    
    Queue->data[Queue->rear] = x;  // 入队
    Queue->rear = (Queue->rear + 1) % MaxSize;  // 更新 rear 指针
    Queue->size++;  // 更新队列元素个数
    return true;
}
 
bool DeQueue(SqQueue* Queue, ElemType** data) {
    if ((Queue->size == 0) || (Queue->rear == Queue->front))  // 判断队列是否为空
        return false;
    
    *data = (*Queue).data[Queue->front];  // 出队
    Queue->front = (Queue->front + 1) % MaxSize;  // 更新 front 指针
    Queue->size--;  // 更新队列元素个数
    return true;
}

int maxDepth(struct TreeNode* root) {
    // 初始化高度为 0
    int high = 0;
    // 如果根节点为空,返回高度为 0
    if(root == 0)
        return high;
    
    // 定义一个队列和相关变量
    SqQueue Queue;
    int QueueLen = 0;
    struct TreeNode* Node;
    // 初始化队列并将根节点入队
    InitQueue(&Queue);
    EnQueue(&Queue,root);
    
    // 循环直到队列为空
    while(!isEmpty(Queue)){
        // 获取当前队列的长度
        QueueLen = Queue.size;
        // 遍历当前队列中的节点
        for(int i=0;i<QueueLen;i++){
            // 出队一个节点
            DeQueue(&Queue,&Node);
            // 如果节点的左子树不为空,将左子树入队
            if(Node->left != NULL)
                EnQueue(&Queue,Node->left);
            // 如果节点的右子树不为空,将右子树入队
            if(Node->right != NULL)
                EnQueue(&Queue,Node->right);
        }
        // 更新高度
        high++;
    }
    // 返回最终高度
    return high;
}

3.111.二叉树的最小深度

3.1分析及思路

运用层序遍历,当遇到一个结点左右孩子都没有时,则说明该结点的深度,就是最小深度,只需加一个判断即可。

3.2代码及注释

typedef struct Node ElemType;  // 定义结构体 Node 为 ElemType
#define MaxSize 10001  // 定义队列的最大容量为 10001
 
typedef struct {
    ElemType* data[MaxSize];  // 存储元素的数组
    int size;  // 队列当前元素个数
    int front, rear;  // 队列头尾指针
} SqQueue;

void InitQueue(SqQueue* Queue) {
    Queue->rear = Queue->front = 0;  // 初始化队列头尾指针
    Queue->size = 0;  // 初始化队列元素个数为 0
}
 
bool isEmpty(SqQueue Queue) {
    if (Queue.rear == Queue.front)  // 判断队列是否为空
        return true;
    return false;
}
 
bool GetTopQueue(SqQueue Queue, ElemType** x) {
    if ((Queue.size == 0) || (Queue.rear == Queue.front))  // 判断队列是否为空或已满
    return false;
    
    *x = Queue.data[Queue.front];  // 获取队首元素
    return true;
}
 
bool EnQueue(SqQueue* Queue, ElemType* x) {
    if ((Queue->rear + 1) % MaxSize == Queue->front)  // 判断队列是否已满
        return false;
    
    Queue->data[Queue->rear] = x;  // 入队
    Queue->rear = (Queue->rear + 1) % MaxSize;  // 更新 rear 指针
    Queue->size++;  // 更新队列元素个数
    return true;
}
 
bool DeQueue(SqQueue* Queue, ElemType** data) {
    if ((Queue->size == 0) || (Queue->rear == Queue->front))  // 判断队列是否为空
        return false;
    
    *data = (*Queue).data[Queue->front];  // 出队
    Queue->front = (Queue->front + 1) % MaxSize;  // 更新 front 指针
    Queue->size--;  // 更新队列元素个数
    return true;
}

int minDepth(struct TreeNode* root) {
    // 初始化高度为 0
    int high = 0;
    // 如果根节点为空,返回高度为 0
    if(root == 0)
        return high;
    
    // 定义一个队列和相关变量
    SqQueue Queue;
    int QueueLen = 0;
    struct TreeNode* Node;
    // 初始化队列并将根节点入队
    InitQueue(&Queue);
    EnQueue(&Queue,root);
    
    // 循环直到队列为空
    while(!isEmpty(Queue)){
        // 获取当前队列的长度
        QueueLen = Queue.size;
        // 遍历当前队列中的节点
        for(int i=0;i<QueueLen;i++){
            // 出队一个节点
            DeQueue(&Queue,&Node);
            // 如果节点的左子树不为空,将左子树入队
            if(Node->left != NULL)
                EnQueue(&Queue,Node->left);
            // 如果节点的右子树不为空,将右子树入队
            if(Node->right != NULL)
                EnQueue(&Queue,Node->right);
            // 当遇到叶子结点时就退出循环
            if((Node->right == NULL) && (Node->left == NULL))
                break;
        }
        // 更新高度
        high++;
        //遇到叶子结点就说明该高度就是最小高度
        if((Node->right == NULL) && (Node->left == NULL))
            break;
    }
    // 返回最终高度
    return high;
}

如有错误还请指正,若有疑问还请评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值