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:二叉搜索树是一种二叉树的树形数据结构,其定义如下:

  1. 空树是二叉搜索树。

  2. 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。

  3. 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。

  4. 二叉搜索树的左右子树均为二叉搜索树。

——源自OI wiki

lowbitlowbit 为一个数转换为二进制后最后的一个1与其后面的0所组成的值。

posted @ 2023-01-08 21:15  LightningCreeper  阅读(36)  评论(0编辑  收藏  举报