二叉树移动石头
假設有一顆二叉樹,已知這棵樹的節點上不均勻的分布了若干石頭,石頭數跟這棵二叉樹的節點數相同,石頭只可以在子節點和父節點之間進行搬運,每次只能搬運一顆石頭。請問如何以最少的步驟將石頭搬運均勻,使得每個節點上的石頭上剛好為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; }
總結
- 上一篇: Rearrange an array o
- 下一篇: Reverse Polish Notat