二叉树基于队列实现的非递归广度优先遍历

#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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值