二叉搜索树是计算机科学中最有用的数据结构之一。存在许多保持其平衡的方法,例如使用树旋转(如 AVL 树)或随机化(如 Treap)。这些方法的一个共同点是它们都有些缓慢且复杂。
但这一切即将改变!计算机科学家 Rob 发明了一种保持有根二叉树平衡的新方法,它比目前最先进的方法要好得多。其核心思想是重复执行一种 Rob 称为“抢劫”(robbery)的操作。一次抢劫就是从树中取走一个叶子节点并将其移除。通过在合适的时机进行抢劫,Rob 能够以 $O(1)$ 的摊销时间保持树的平衡。
有些人批评了 Rob 的革命性发现,认为从树中移除元素会使算法变得不正确。Rob 不同意这是一个大问题;如果你打算存储 $2 \cdot 10^5$ 个数字,你可能并不需要全部存储它们。但 Rob 接受了批评,并决定寻找一种最小化抢劫次数的方法。
图 H.1:样例输入 2 的示意图。在移除标记为红色的三个顶点(4、5 和 10)后,树变得强平衡;这是使树达到强平衡所需移除的最小顶点数。
给定一棵有 $n$ 个顶点的有根二叉树。顶点编号从 1 到 $n$,顶点 1 为根。你的任务是找到使树达到“强平衡”所需的最小抢劫次数,这意味着它的所有子树都是平衡的。如果一棵有根二叉树的左子树和右子树的深度之差不超过 1,则称其为平衡的。回想一下,抢劫仅仅是取走一个叶子并将其移除,这样做可能会使其父节点变成一个叶子。参见图 H.1 了解示例。
输入格式
输入包含:
- 一行包含一个整数 $n$ ($1 \le n \le 2 \cdot 10^5$),表示树中顶点的数量。
- $n - 1$ 行,每行包含两个整数 $u$ 和 $v$ ($1 \le u, v \le n, u \neq v$),表示顶点 $u$ 和 $v$ 之间的一条边。
保证给定的边构成一棵以顶点 1 为根的有效二叉树。然而,边的出现顺序可以是任意的,且边是无向的:$u$ 可以是 $v$ 的父节点,反之亦然。
输出格式
输出使树达到强平衡所需移除的叶子的最小数量。
样例
样例输入 1
6 1 2 1 3 3 4 3 5 5 6
样例输出 1
1
样例输入 2
12 1 2 2 3 3 4 3 5 1 6 6 7 7 8 7 9 9 10 6 11 11 12
样例输出 2
3