#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;
}
生成树(广度/深度)
最新推荐文章于 2025-05-24 16:57:29 发布