问题 5381 --二叉查找树

5381: 二叉查找树

题目描述

二叉查找树是一种特殊的二叉树(每个节点最多只有两个儿子的树)。树的每个节点上存有一个唯一的值,并且满足:这个节点的左子树内所有点的值都比这个节点的值小,且右子树内所有点的值都比这个节点的值要大。 对于一棵二叉查找树T,我们可以将一个值为val的新点插入T中,且保持树的性质。算法如下: ``` //lc[x]表示节点x的左儿子 //rc[x]表示节点x的右儿子 //num[x]表示节点x的权值 void insert(int x, int val) { if (val < num[x]) { if (!lc[x]) { lc[x] = ++T; return ; } else insert(lc[x], val); } else if (val > num[x]) { if (!rc[x]) { rc[x] = ++T; return ; } else insert(rc[x], val); } } ``` 需要将 $val$ 插入二叉查找树 $T$ 时,执行 `insert(root, val)` 。 现在有 $N$ 个数需要插入一棵空树中。给定插入序列,请在每个元素被插入之后,输出所有节点的深度总和(根的深度为 $0$ )。

输入

输入的第一行一个整数 $n$,表示序列长度。 以下 $n$ 行是序列中的数字,这些数字是各不相同的,在 $[1,n]$ 区间。

输出

输出 $n$ 行,第 $i$ 行整数表示第 $i$ 个数插入树后,至这个节点的节点深度总和。

样例输入输出

输入#1 复制
8
3
5
1
6
8
7
2
4
输出#1 复制
0
1
2
4
7
11
13
15

提示

对于 $100\%$ 的数据,$N \leq 3 \times 10^5$。
序号 标题 作者 发表时间 费用 订购数 操作