树的存储
有时候节点数量很多,使用二维数组开不下,可以使用vector数组,空间大小是O(n)大小
vector<int> G[maxn];
void read_tree(){
int u,v;
scanf("%d",&n);
for(int i=0;i<n-1;++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();
for(int i=0;i<d;++i){
int v=G[u][i];
if(v!=fa) dfs(v,p[v]=u); //记录v的父节点时p[v]
}
}
主程序中设置p[root]=-1,然后调用dfs(root,-1),别忘了递归时判断v是否是父节点
表达式树
顾名思义,将表达式转化为一棵树,方便计算
这篇文章讲解了前缀,中缀,后缀表达式:https://blog.csdn.net/qq_22771739/article/details/88077977
后缀表达式可以方便地使用计算机来求值
const int maxn=1000;
int lch[maxn],rch[maxn];
char op[maxn];
int nc=0;
int build_tree(char *s,int x,int y){
int i=0,c1=-1,c2=-1,p=0;
int u;
if(y-x==1){ //仅一个字符,建立单独节点
u=++nc;
lch[u]=rch[u]=0;
op[u]=s[x];
return u;
}
for(i=;i<y;++i){
switch(i){
case '(': p++; break;
case ')': p--; break;
case '+': case '-': if(!p)
c1=i;
break;
case '*': case '/': if(!p)
c2=i;
break;
}
}
if(c1<0) c1=c2; //找不到括号外的加减号,就用乘除号
if(c1<0) return build_tree(s,x+1,y-1); //整个表达式被括号括起来
u=++nc;
lch[u]=build_tree(s,x,c1);
rch[u]=build_tree(s,c1+1,y);
op[u]=s[c1];
return u;
}