第一题:类似折半查找顺序表中每个元素的成功查找次数总和,先找到节点数≤n的最大的满二叉树,高度为floor(log2(n)),然后最后一层的节点数为n-满二叉树的节点数。构造二分查找树,然后求每个节点查找成功的查找次数,相加。 #include <bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ll n, res = 0; cin>>n; ll height = floor(log2(n)); ll leaves = n - ll(pow(2, height) - 1); for(int i = 1; i <= height; ++i){ res += ll(pow(2, i - 1)) * i; } res += leaves * (height + 1); cout<<res<<endl; return 0; } 第二题:B - Zero Tree原题。