4254: BST断裂

内存限制:256 MB 时间限制:2 S
题面:传统 评测方式:文本比较 上传者:
提交:4 通过:4

题目描述

设T是任意二叉树,它的每个顶点都不超过两个子树。
给定的树是根的,所以只有一个顶点没有父节点,它是树的根。每个顶点上都写有一个整数。
对树T中的每个值运行以下算法:
1.设置指向树根的指针。
2.如果当前顶点中的值等于要查找的数字,则返回成功。
3.如果当前顶点中的值大于要查找的数字,则转到顶点的左侧子级。
4.如果当前顶点中的值小于要查找的数字,则转到顶点的右子级。
5.如果尝试转到不存在的顶点,则返回失败。
以下是所述算法的伪代码:
bool find(TreeNode t, int x) {
    if (t == null)
        return false;
    if (t.value == x)
        return true;
    if (x < t.value)
        return find(t.left, x);
    else
        return find(t.right, x);
}
find(root, x);
如果树是二进制搜索树(即,对于每个节点,左子树的值小于节点中的值,右子树的值大于节点中的数值),则所描述的算法正确工作。
但如果树不是二进制搜索树,它可能返回无效结果。
由于给定的树不一定是二进制搜索树,因此并非所有的数字都可以通过这种方式找到。
您的任务是计算在树中的每个值上运行搜索失败的次数。
如果树有多个顶点,这些顶点上的值相同,那么应该分别对每个顶点运行算法。

输入格式

第一行包含整数n(1 ≤ n ≤ 105)-树中的顶点数。
接下来的n行中的每一行包含3个数字v、l、r(0 ≤ v ≤ 109)-当前顶点上的值、顶点的左子级的索引和顶点的右子级的指数。
如果某个孩子不存在,则编号为-1。
请注意,树的不同顶点可能包含相同的值。

输出格式

打印搜索算法失败的次数。

输入样例 复制

3
15 -1 -1
10 1 3
5 -1 -1

输出样例 复制

2

数据范围与提示

样例输入
8
6 2 3
3 4 5
12 6 7
1 -1 8
4 -1 -1
5 -1 -1
14 -1 -1
2 -1 -1


样例输出
1


提示
在本例1中,树的根位于顶点2。搜索数字5和15将返回失败,因为在第一步算法将选择不包含您要查找的数字的子树。