1 无根树转有根树
问题:输入一个n个结点的无根树的各条边,并指定一个根结点,要求把该树转化为有根树,输出各个结点的父结点编号。。
用vector数组存边
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
vector<int> G[maxn];
int n,root;
int p[maxn];
//vector数组存无根树
void read_tree(){
int u,v;
scanf("%d",&n);//n为边数
for(int i=0;i<n;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
}
//转化过程
void dfs(int u,int fa){//递归转化为以u为根的子树,u的父结点为fa
int d=G[u].size();//结点u的相邻点个数
for(int i=0;i<d;i++){
int v=G[u][i];//结点u的第i个相邻点v
if(v!=fa) dfs(v,p[v]=u);//把v的父结点设为u,然后递归转化为v为根的子树
}
}
int main(){
read_tree();
cin>>root;//输入根结点的值
p[root]=-1;
dfs(root,-1);
for(int i=1;i<=n;i++){
cout<<i<<"的父结点编号:"<<p[i]<<endl;
}
return 0;
}
/*
7
0 1
0 2
0 3
1 4
1 5
5 6
5 7
1
1的父结点编号:-1
2的父结点编号:0
3的父结点编号:0
4的父结点编号:1
5的父结点编号:1
6的父结点编号:5
7的父结点编号:5
*/
2. 表达式树
待补