无向图的深度和广度遍历结果

1,从顶点2出发的深度和广度遍历结果;

2,并画出对应的深度和广度生成树

 

#include<bits/stdc++.h>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define GRASIZE 5//定义图的顶点个数为5个节点
struct GraphNode
{
 int label;
 vector<GraphNode*> neighbors;
 GraphNode(int x) :label(x) {};
};

class GraphOrder {
public:
    	//深度优先遍历
	static void DFS_gra(GraphNode* graph[])
  	{
     		int visit[GRASIZE] = { 0 };

     		for (int i = 2; i < GRASIZE; i++)
     		{
       			if (visit[i]==0)
       			{
            			DFS_i(graph[i],visit);
       			}
     		}
  	}
	//广度优先遍历
 	static void BFS_gra(GraphNode* graph[])
 	{
  		int visit[GRASIZE] = { 0 };
  		for (int i = 2; i < GRASIZE; i++)
  		{
   			if (visit[i] == 0)
   			{
    			BFS_i(graph[i], visit);
   			}
  		}
 	}
 private:
 	//递归
 	static void DFS_i(GraphNode* node,int visit[]) {
  		visit[node->label] = 1;
  		cout << node->label << " ";
  		for (int i = 0; i < node->neighbors.size(); i++)
  		{
   			if (visit[node->neighbors[i]->label]==0)
   			{
    				DFS_i(node->neighbors[i],visit);
   			}
  		}
 	}
 	//队列实现
 	static void BFS_i(GraphNode* node, int visit[]) {
  		queue<GraphNode*> Q;
  		Q.push(node);
  		visit[node->label] = 1;
  		while (!Q.empty()) {
   			GraphNode* node = Q.front();
   			Q.pop();
   			cout << node->label << " ";
   			for (int i = 0; i < node->neighbors.size(); i++)
   			{
    				if (visit[node->neighbors[i]->label]==0)
    				{
     					Q.push(node->neighbors[i]);
     					visit[node->neighbors[i]->label] = 1;
    				}
   			}
  		}
 	}
};
int main()
{
	GraphNode* graph[GRASIZE];
 	for (int i = 0; i < GRASIZE; i++)
 	{
 		graph[i] = new GraphNode(i);
 	}
 	graph[0]->neighbors.push_back(graph[1]);
 	graph[0]->neighbors.push_back(graph[2]);
 	graph[1]->neighbors.push_back(graph[0]);
 	graph[1]->neighbors.push_back(graph[3]);
 	graph[1]->neighbors.push_back(graph[4]);
 	graph[2]->neighbors.push_back(graph[0]);
 	graph[2]->neighbors.push_back(graph[3]);
 	graph[3]->neighbors.push_back(graph[4]);
 	graph[3]->neighbors.push_back(graph[2]);
 	graph[3]->neighbors.push_back(graph[1]);
 	graph[4]->neighbors.push_back(graph[1]);
 	graph[4]->neighbors.push_back(graph[3]);

	cout << "深度优先遍历:";
	GraphOrder::DFS_gra(graph);
 	cout << endl;

 	cout << "广度优先遍历:";
 	GraphOrder::BFS_gra(graph);

	for (int i = 0; i < GRASIZE; i++)
 	{
  		delete graph[i];
 	}
 	return 0;
}

码字不易,如果有帮助请点一下我回答右上方的采纳,谢谢!以后有什么问题可以互相交流。

深搜用栈,广搜用队列。

把树的模型建好,然后对节点遍历就好啦。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632