#include <stdio.h>
#include <stdlib.h>
// 定义树的节点
typedef struct TreeNode {
int data;
struct TreeNode* lchild;
struct TreeNode* rchild;
} TreeNode;
//下面开始定义队列的结点,结点的data是TreeNode*类型的,这一块容易绕,注意一下
typedef struct QueueNode{
TreeNode* data;
struct QueueNode* next;
}QueueNode;
//下面定义队列
typedef struct Queue{
QueueNode* front;//队头
QueueNode* rear;//队尾
//int length;
}Queue;
//队列初始化函数,里面传进去的是一个指向某个队列的指针
void initQueue(Queue* q){
q->front=q->rear=NULL;
}
int isEmpty(Queue* q){//C语言没有bool,只有int的0和1
return q->rear==NULL;//rear为NULL时候肯定是空的,由于我在pop函数里面已经确定了队列中最后一个元素一旦弹出便立马变为NULL
}
void push(Queue* q,TreeNode* t){
if (q->rear == NULL) {
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
newNode->data=t;
q->front = q->rear = newNode;
q->rear->next = NULL;
} else {
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
newNode->data=t;
q->rear->next = newNode;
q->rear = q->rear->next;
q->rear->next = NULL;
}
}
TreeNode* pop(Queue* q){
if(isEmpty(q)) return NULL;//空队列返回NULL
TreeNode* temp=q->front->data;//最后要返回的是TreeNode*类型的,但结点是QueueNode*类型的
QueueNode* delNode=q->front;
q->front=q->front->next;
if(q->rear==delNode){// 如果删除的是唯一的节点,则更新头尾指针为NULL
q->front=q->rear=NULL;
}
free(delNode);//释放空间
return temp;
}
// 释放队列占用的内存
void clearQueue(Queue* q) {
while (!isEmpty(q)) {
pop(q);
}
}
void bfs(TreeNode* root){
if(root==NULL) return;
Queue q;
initQueue(&q);//初始化
push(&q,root);//将根节点压入
while(!isEmpty(&q)){
TreeNode* temp=pop(&q);
printf("%d ",temp->data);
if(temp->lchild!=NULL){
push(&q,temp->lchild);
}
if(temp->rchild!=NULL){
push(&q,temp->rchild);
}
}
clearQueue(&q);
}
//上面都是队列的操作以及bfs的代码
//下面是建树
//总共9个结点,root相当于pnode1,树的图片我会附出来
typedef struct TreeNode* PTreeNode;
PTreeNode root;
PTreeNode pnode2,pnode3,pnode4,pnode5,pnode6,pnode7,pnode8,pnode9;
void BuildTree(){
root=(PTreeNode)malloc(sizeof(TreeNode));
pnode2=(PTreeNode)malloc(sizeof(TreeNode));
pnode3=(PTreeNode)malloc(sizeof(TreeNode));
pnode4=(PTreeNode)malloc(sizeof(TreeNode));
pnode5=(PTreeNode)malloc(sizeof(TreeNode));
pnode6=(PTreeNode)malloc(sizeof(TreeNode));
pnode7=(PTreeNode)malloc(sizeof(TreeNode));
pnode8=(PTreeNode)malloc(sizeof(TreeNode));
pnode9=(PTreeNode)malloc(sizeof(TreeNode));
root->lchild = root->rchild = NULL;
pnode2->lchild = pnode2->rchild = NULL;
pnode3->lchild = pnode3->rchild = NULL;
pnode4->lchild = pnode4->rchild = NULL;
pnode5->lchild = pnode5->rchild = NULL;
pnode6->lchild = pnode6->rchild = NULL;
pnode7->lchild = pnode7->rchild = NULL;
pnode8->lchild = pnode8->rchild = NULL;
pnode9->lchild = pnode9->rchild = NULL;
root->data=1;
pnode2->data=2;
pnode3->data=3;
pnode4->data=4;
pnode5->data=5;
pnode6->data=6;
pnode7->data=7;
pnode8->data=8;
pnode9->data=9;
root->lchild=pnode2;
root->rchild=pnode3;
pnode2->lchild=pnode4;
pnode3->lchild=pnode5;
pnode3->rchild=pnode6;
pnode5->rchild=pnode7;
pnode6->lchild=pnode8;
pnode6->rchild=pnode9;
}
int main(){
BuildTree();
bfs(root);
return 0;
}
这些指针是真的烦(还是c++的stl大法好,不用自己造轮子),上面代码里面的BulidTree()是我非常笨的一个造树的方法,不过不用消耗我仅剩的一点脑细胞(doge)