33,008
社区成员
发帖
与我相关
我的任务
分享
中间的 ][ 之间插入插入代码即可~~~~~
#include <iostream>
#include <math.h>
using namespace std;
struct tree //二叉树的结构
{
int num; //石头的数量
tree *left, *right, *parent; //左右和双亲节点
};
tree* build(int data[], int n)
/*建树的函数,data是存石头数量的数组,按从上到下的顺序存储,
如果有空节点则用-1代替,n是节点个数(空节点也算),返回值是树根。(我写的可能不太好,大家可以自己实现)
*/
{
int i;
tree* t[999];
for(i = 0; i < n; i++)
{
if(data[i] != -1)
{
t[i] = new tree;
t[i]->num = data[i];
t[i]->left = t[i]->right = t[i]->parent = NULL;
}
else t[i] = NULL;
}
for(i = 0; i < n; i++)
if(t[i])
{
if(2*i+1>=n)
t[i]->left = t[i]->right = NULL;
else
{
t[i]->left = t[2*i+1];
t[i]->right = t[2*i+2];
}
if(i)
t[i]->parent = t[(i-1)/2];
else
t[i]->parent = NULL;
}
return t[0];
}
//主要的算法,返回这棵树需要移动几步
int move(tree *t)
{
int x = 0;
if(t)
{
x += move(t->left)+move(t->right); //左右子树需要移动的步数
if(t->parent)
{
t->parent->num += (t->num-1); //从双亲节点移来或移走石头
x += abs(t->num-1); //加上本节点需要移动的次数
t->num = 1;
}
}
return x;
}
int main()
{
int data[999], n = 0;
while(cin >> n)
{
int i;
for(i = 0; i < n; i++)
cin >> data[i];
tree *t = build(data, n);
cout << move(t) << endl;
}
return 0;
}