POJ 2309 BST 题解
题目大意
有一颗 无穷大的,满的,结点为正整数的 二叉搜索树(BST) ,现在需要求出以 \(x\) 为根的子树的最左节点与最右节点。
解法
要理解这道题,我们先需要画图。
贴一张图
如果你仔细观察就会发现:
每一个树的根节点的 lowbit
加上它本身就是它的后继节点(这里的后继节点指的是这整棵树的后一个节点)
每一个树的根节点的 lowbit
减去它本身就是它的前驱节点(这里的前继节点指的是这整棵树的前一个节点)
\(4\) 的 lowbit
为 \(4\) ,\(4-4=0\) ,由于 \(4\) 没有前驱节点,故设它的前驱节点为 \(0\) ; \(4+4=8\) ,它的后继节点为 \(8\)。
\(12\) 的 lowbit
为 \(4\) ,\(12-4=8\) ,\(12\) 的前驱节点为 \(8\);\(12+4=16\),\(12\) 的后继节点为 \(16\)。
到了这一步,显然,以 \(x\) 为根的子树的最左端节点为 \(x\) 的前驱节点加一,以 \(x\) 为根的子树的最右端节点为 \(x\) 的后继节点减一。
标程
#include <iostream>
using namespace std;
int n;
long long tmp;
long long lowbit(long long x) {
return (-x) & x;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> tmp;
cout << tmp - lowbit(tmp) + 1 << " " << tmp + lowbit(tmp) - 1 << endl;
}
return 0;
}
备注
BST:二叉搜索树是一种二叉树的树形数据结构,其定义如下:
空树是二叉搜索树。
若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。
若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。
二叉搜索树的左右子树均为二叉搜索树。
——源自OI wiki
lowbit
:lowbit
为一个数转换为二进制后最后的一个1
与其后面的0
所组成的值。