生成树(广度/深度)

本文介绍了一种构建图的生成树的方法,包括深度优先搜索(DFS)和广度优先搜索(BFS)。通过创建邻接矩阵来表示图,并使用递归方式实现深度优先遍历,同时构建相应的生成树。此外,还介绍了如何利用队列实现广度优先遍历来构建生成树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<algorithm>
#include<vector>
#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define NOT_TLE ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define MAXVex 100  //最大顶点数
#define INFINITY 65535  //代表无穷大

typedef struct{
	int adjust[MAXVex][MAXVex];
	int vexnums, edgenums;  //记录顶点数与边数
}Mygraph;

//孩子兄弟节点
typedef struct node {
	int data;
	node *lchild, *nextbro;
}MyTree;

void createDN(Mygraph *mg)
{
	cout << "请输入顶点数和边数:";
	int n, m; cin >> n >> m;  //节点数和边数
	mg->vexnums = n; mg->edgenums = m;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			if (i != j) mg->adjust[i][j] = INFINITY;
			else mg->adjust[i][j] = 0;
		}
	}
	for (int i = 0; i < m; ++i) {
		int x, y; cin >> x >> y;
		//无权图,用1表示有链接
		mg->adjust[x][y] = 1; mg->adjust[y][x] = 1;
	}
}

void findnode(MyTree* root, int r,MyTree* &t)
{
	if (root == NULL) return;
	if (root->data == r) {
		t = root;
		return;
	}
	findnode(root->lchild, r,t);
	findnode(root->nextbro, r,t);
}

void deepTree(Mygraph mg, MyTree* &root)
{
	cout << "请输入深度优先搜索的开始节点(<=" << mg.vexnums << "):";
	int r; cin >> r;
	MyTree *pt = (MyTree*)malloc(sizeof(MyTree));
	pt->data = r; pt->lchild = pt->nextbro = NULL;
	root = pt;
	vector<int> visited;  //用来存放已经访问过的节点
	visited.push_back(r);
	stack<int> dfs;  //用栈进行深搜
	dfs.push(r);
	while (!dfs.empty()) {
		while (1) {
			int p = dfs.top();
			MyTree *t=NULL; findnode(root, p,t);
			int i;
			for (i = 0; i <= mg.vexnums; ++i) {
				if (mg.adjust[p][i] == 1&&find(visited.begin(),visited.end(),i)==visited.end()) {
					dfs.push(i);
					MyTree *q = (MyTree*)malloc(sizeof(MyTree));
					q->data = i; q->lchild = q->nextbro = NULL;
					if (t->lchild == NULL) t->lchild = q;
					else {
						//一个节点连接许多节点,则都为第一个孩子的兄弟节点
						if (t->lchild->nextbro == NULL) t->lchild->nextbro = q;
						else {
							t = t->lchild->nextbro;
							while (t->nextbro) {
								t = t->nextbro;
							}
							t->nextbro = q;
						}
					}
					visited.push_back(i);
					break;
				}
			}
			if (i == mg.vexnums + 1) break;
		}
		dfs.pop();
	}
}
//前序遍历输出
void preorderprint(MyTree* root)
{
	if (root) {
		cout << root->data << " ";
		preorderprint(root->lchild);
		preorderprint(root->nextbro);
	}
	return;
}

void wideTree(Mygraph mg, MyTree* &root)
{
	cout<<"\n请输入广度优先生成树的起始根节点(<=" << mg.vexnums << "):";
	int r; cin >> r;
	MyTree* p = (MyTree*)malloc(sizeof(MyTree));
	p->data = r;p->lchild = p->nextbro = NULL;
	root = p;
	queue<int> bfs; bfs.push(r);
	vector<int> visited; visited.push_back(r);
	while (!bfs.empty()) {
		int var = bfs.front(); bfs.pop();
		MyTree *t = NULL; findnode(root, var, t);
		int i;
		for (i = 0; i <= mg.vexnums; ++i) {
			if (mg.adjust[var][i] == 1 && find(visited.begin(), visited.end(), i) == visited.end()) {
				bfs.push(i);
				MyTree *q = (MyTree*)malloc(sizeof(MyTree));
				q->data = i; q->lchild = q->nextbro = NULL;
				if (t->lchild == NULL) t->lchild = q;
				else {
					//一个节点连接许多节点,则都为第一个孩子的兄弟节点
					if (t->lchild->nextbro == NULL) t->lchild->nextbro = q;
					else {
						t = t->lchild->nextbro;
						while (t->nextbro) {
							t = t->nextbro;
						}
						t->nextbro = q;
					}
				}
				visited.push_back(i);
			}
		}
	}
}
int main()
{
	Mygraph mg; MyTree *myroot = NULL;
	createDN(&mg);
	//cout << "请输入生成树的方式(深度优先(1)/广度优先(0):";
	//int sym; cin >> sym;
	deepTree(mg,myroot);
	cout << "深度遍历生成树为:";
	preorderprint(myroot);
	wideTree(mg,myroot);
	cout << "广度遍历生成树为:";
	preorderprint(myroot);
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值