二叉树的层次遍历、二叉树求宽度、图的广度优先搜索
一类问题,层次遍历思想。
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);
}
}
}
}