表达式树&&无根树转化为有根树

//将无根树转化为有根树
vector<int>g[maxn];
void read-tree()
{
int u,v;
scanf("%d",&n);
for(int i=0i<n-1;++i)
{
scanf("%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}

//转化过程:
void dfs(int u,int fa)//递归转化为以u为根的子树,u的父节点为fa 
{
for(int i=0;i<g.size();++i)
{
int v=g[u][i];
if(v!=fa)
dfs(v,p[v]=u);//把u置为v的根节点,然后递归转化以v为根结点的子树
 
}
}
//主程序要设置p[root]=-1,然后在调用dfs(root,-1); 


//p353表达式树 
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,ch1=-1,ch2=-1,p=0,u;
if(y-x==1)
{
u=++nc;
lch[u]=0,rch[u]=0,op[u]=s[x];
return u;
}
for(i=x;i<y;++i)
{
switch(s[i])
{
case '(':p++;break;
case ')':p--;break;
case '+':
case '-':if(p==0)ch1=i;break;
case '*':
case '/':if(p==0)ch2=i;break;
}
}
if(ch1<0)
ch1=ch2;
if(ch1<0)
return build_tree(s,x-1,y-1);
u=++nc;
lch[u]=build_tree(s,x,ch1);
lrh[u]=build_tree(s,ch+1,y);
op[u]=s[ch1];
return u;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值