思路:使用向量结构存储索引实现多叉树
目前代码进度:实现了制索引,dfs,bfs
总代码:
#include<bits/stdc++.h>
//节点计数从零开始
using namespace std;
#define maxn 1000
vector<int>index[maxn];
//int data[maxn];
void inpu()
{
;
}
void creatindex(int length)//制索引 输入length为边数
{
memset(index,0,sizeof(index));
int r,c;
for(int i=0;i<length;i++)
{
cin>>r>>c;//输入方式 r邻接c
index[r].push_back(c);
}
}
void test(int m)//测试 m为节点数
{
vector<int>::iterator it;
for(int i=0;i<m;i++)
{
it=index[i].begin();
while(it!=index[i].end())
{
cout<<"-"<<i<<"- "<<*it<<" ";
it++;
}
cout<<endl;
}
}
void dfs(int m)//m目前所在节点
{
//停止条件
/*
if(flag)
{
return;
}
*/
//节点操作
/*
cout<<"this is"<<m<<"th node"<<endl;
*/
//递归操作
if(!index[m].empty())
{
vector<int>::iterator it;
it=index[m].begin();
while(it!=index[m].end())
{
dfs(*it);
it++;
}
}
}
void bfs(int m)//m为需要遍历的根节点
{
deque<int>cur;//存放bfs顺序的队列
cur.clear();
cur.push_back(m);//队列初始化
//deque<int>::iterator it;//用于遍历
vector<int>::iterator it;//用来临时遍历索引,往队列里面加元素的迭代器
while(!cur.empty())
{
int now=cur[0];
//在这里插遍历操作,now为现在遍历到的节点的序号
// cout<<cur[0]<<endl;
if(!index[cur[0]].empty())
{
it=index[cur[0]].begin();//队头出队,开始遍历这个节点
while(it!=index[cur[0]].end())
{
cur.push_back(*it);
it++;
}
}
cur.pop_front();
}
return;
}
int main()
{
int m,n;
cin>>m;
creatindex(m);
// test(n);
// dfs(0);
bfs(0);
return 0;
}
注解:
vector<int>index[maxn];
上面是保存索引的变量,保存内容为每个节点的孩子节点号,此向量不直接存储该树有多少节点
在此默认索引从零开始,即第一个节点为零号,
void creatindex(int length)//制索引 输入length为边数
{
memset(index,0,sizeof(index));
int r,c;
for(int i=0;i<length;i++)
{
cin>>r>>c;//输入方式 r邻接c
index[r].push_back(c);
}
}
上面的函数初始化并建立索引,调用参数为该树有多少边(树中边数为节点数减一,故参数也为节点数减一)调用后输入边的具体链接:每组输入两个数,第一个为根节点,第二个为孩子节点
void dfs(int m)//m目前所在节点
{
//停止条件
/*
if(flag)
{
return;
}
*/
//节点操作
/*
cout<<"this is"<<m<<"th node"<<endl;
*/
//递归操作
if(!index[m].empty())
{
vector<int>::iterator it;
it=index[m].begin();
while(it!=index[m].end())
{
dfs(*it);
it++;
}
}
}
上面的函数实现dfs
调用参数为所在节点位置,从头调用即为零,按需在停止条件和操作位置加入代码即可
void bfs(int m)//m为需要遍历的根节点
{
deque<int>cur;//存放bfs顺序的队列
cur.clear();
cur.push_back(m);//队列初始化
//deque<int>::iterator it;//用于遍历
vector<int>::iterator it;//用来临时遍历索引,往队列里面加元素的迭代器
while(!cur.empty())
{
int now=cur[0];
//在这里插遍历操作,now为现在遍历到的节点的序号
// cout<<cur[0]<<endl;
if(!index[cur[0]].empty())
{
it=index[cur[0]].begin();//队头出队,开始遍历这个节点
while(it!=index[cur[0]].end())
{
cur.push_back(*it);
it++;
}
}
cur.pop_front();
}
return;
}
上面的函数实现bfs,函数参数为开始遍历的节点的序号,插操作代码的时候注意变量now代表正在遍历的节点的序号