假设有一颗二叉树,已知这棵树的节点上不均匀的分布了若干石头,石头数跟这棵二叉树的节点数相同,石头只可以在子节点和父节点之间进行搬运,每次只能搬运一颗石头。请问如何以最少的步骤将石头搬运均匀,使得每个节点上的石头上刚好为1。
从底向上,后序遍历
每个节点有个预支功能
int moveStone(Node *root, int &count) {//返回当前节点需要向父节点预支或者送去多少石头
if (root == NULL)
return 0;
int left = 0, right = 0;
if (root->left)
left = moveStone(root->left, count);
if (root->right)
right = moveStone(root->right, count);
count += abs(left + right + root->val -1);//增加当前节点与父节点的操作数
return left + right + root->val -1;
}
网上的代码:
int MoveStone(node *root, int &moves)
{
int l, r, ls, rs;
if(!root)
return (moves=0);
l = MoveStone(root->left, ls);
r = MoveStone(root->right, rs);
moves = abs(l) + abs(r) + ls + rs;
return l+r+root->stone-1;
}