题目链接/文章讲解/视频讲解: 代码随想录
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;
}
如有错误还请指正,若有疑问还请评论。