二叉树的层次遍历、二叉树求宽度、图的广度优先搜索

二叉树的层次遍历、二叉树求宽度、图的广度优先搜索

一类问题,层次遍历思想。

1. 二叉树的层次遍历

/*
1.将根结点入队
2.出队访问出队结点,若有左子树将左子树入队,若有右子树将右子树入队
循环2直到队空。
*/
Status LevelOrder(BiTree T)
{
	queue<BiTree> q;
	BiTree p;
	q.push(T);
	while (q.empty() == false)
	{
		p = q.front();
		q.pop();
		visit(p);
		if (p->lchild != NULL)
			q.push(p->lchild);
		if (p->rchild != NULL)
			q.push(p->rchild);
	}
}

2. 二叉树求宽度

int GetWidth(BiTree T)
{
	if (T == NULL)		return 0;  //空树
	queue <BiTree> q;
	BiTree p = T;
	int maxsize = 1;  //根节点为一层
	int len;
	q.push(p);
	while (q.empty() == false)  //保证每次大循环,队列里的结点为某一层的全部结点。
	{
		for (len = q.size(); len > 0; len--)  //将当前队列里结点出队,将它们的所有孩子入队
		{
			p = q.front();
			q.pop();
			if (p->lchild)		q.push(p->lchild);
			if (p->rchild)		q.push(p->rchild);
		}
		int size = q.size();  //当前层的下一层元素个数
		maxsize = max(maxsize, size);
	}
	return maxsize;
}

3. 图的广度优先搜索

/*
1. 访问,入队
2. 出队,将其所有未访问的邻接点,访问并入队
循环2直到队空。
*/
void visit(int v){}
void BFS(ALGraph G, int v)  //用邻接表表示法宽度优先搜索
{
	queue<int> q;
	ArcNode* p;  //边结点
	int visited[MVNum] = {0};  //访问标记数组,0表示未访问
	int w;
	
	visit(v);
	visited[v] = 1;  //已访问
	q.push(v);
	while (q.empty() == false)
	{
		w = q.front();
		q.pop();
		for (p = G.vertexes[w].firstarc; p != NULL; p = p->nextarc)
		{
			if (visited[p->adjvex] == 0)
			{
				visit(p->adjvex);
				visited[p->adjvex] = 1;
				q.push(p->adjvex);
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值