C++程序 求去掉最后1个空格 输出格式错误
加分二叉树设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为...
加分二叉树
设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:
subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数
若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。
试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;
(1)tree的最高加分
(2)tree的前序遍历
Input第1行:一个整数n(n<30),为节点个数。
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。
Output第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:n个用空格隔开的整数,为该树的前序遍历。
Sample Input
5
5 7 1 2 10
Sample Output
145
3 1 2 4 5
代码是: 运行没有问题 就是最后那个空格去不掉 汗 空格位置我打备注了
#include<iostream>
using namespace std;
int f[31][31]={0},a[31],root[31][31],n;
void init()
{
int i;
cin>>n;
for(i=1;i<=n;i++)cin>>a[i];
}
int tree(int l,int r)
{
int maxx=0,t,k;
if(l>r)return 1;
if(l==r)return a[l];
if(f[l][r]>0)return f[l][r];
for(k=l;k<=r;k++)
{t=tree(l,k-1)*tree(k+1,r)+a[k];
if(t>maxx){maxx=t;root[l][r]=k;}
}
f[l][r]=maxx;
return maxx;
}
void print(int l,int r)
{
if(l==r){cout<<l<<' ';return;}
if(l>r)return;
cout<<root[l][r]<<' '; //就是这里的空格 怎么只把最后一个空格去了
print(l,root[l][r]-1);
print(root[l][r]+1,r);
}
int main()
{
init();
cout<<tree(1,n)<<endl;
print(1,n);
return 0; 展开
设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:
subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数
若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。
试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;
(1)tree的最高加分
(2)tree的前序遍历
Input第1行:一个整数n(n<30),为节点个数。
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。
Output第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:n个用空格隔开的整数,为该树的前序遍历。
Sample Input
5
5 7 1 2 10
Sample Output
145
3 1 2 4 5
代码是: 运行没有问题 就是最后那个空格去不掉 汗 空格位置我打备注了
#include<iostream>
using namespace std;
int f[31][31]={0},a[31],root[31][31],n;
void init()
{
int i;
cin>>n;
for(i=1;i<=n;i++)cin>>a[i];
}
int tree(int l,int r)
{
int maxx=0,t,k;
if(l>r)return 1;
if(l==r)return a[l];
if(f[l][r]>0)return f[l][r];
for(k=l;k<=r;k++)
{t=tree(l,k-1)*tree(k+1,r)+a[k];
if(t>maxx){maxx=t;root[l][r]=k;}
}
f[l][r]=maxx;
return maxx;
}
void print(int l,int r)
{
if(l==r){cout<<l<<' ';return;}
if(l>r)return;
cout<<root[l][r]<<' '; //就是这里的空格 怎么只把最后一个空格去了
print(l,root[l][r]-1);
print(root[l][r]+1,r);
}
int main()
{
init();
cout<<tree(1,n)<<endl;
print(1,n);
return 0; 展开
2个回答
展开全部
void print(int l,int r)
{
if(l==r){cout<<' '<<l;return;}//把空格加在前面
if(l>r)return;
cout<<' '<<root[l][r]; //把空格加在前面
print(l,root[l][r]-1);
print(root[l][r]+1,r);
}
//都把空格加在前面,这是最简单的方法了。注意有两个地方要把空格加在前面
{
if(l==r){cout<<' '<<l;return;}//把空格加在前面
if(l>r)return;
cout<<' '<<root[l][r]; //把空格加在前面
print(l,root[l][r]-1);
print(root[l][r]+1,r);
}
//都把空格加在前面,这是最简单的方法了。注意有两个地方要把空格加在前面
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没有仔细看逻辑,至少在你个样例中,最后一个空格是l==r发生的。
如果不是,你可以做类似修改。
void print(int l,int r)
{
if(l==r){
if(r==n) //这里加一个判断
cout<<l;
else
cout<<l<<' ';
return;
}
if(l>r)return;
cout<<root[l][r]<<' '; //就是这里的空格 怎么只把最后一个空格去了
print(l,root[l][r]-1);
print(root[l][r]+1,r);
}
如果不是,你可以做类似修改。
void print(int l,int r)
{
if(l==r){
if(r==n) //这里加一个判断
cout<<l;
else
cout<<l<<' ';
return;
}
if(l>r)return;
cout<<root[l][r]<<' '; //就是这里的空格 怎么只把最后一个空格去了
print(l,root[l][r]-1);
print(root[l][r]+1,r);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询