您的位置:首页 > 理论基础 > 数据结构算法

数据结构录 之 BST的高级应用。

2015-12-22 15:35 120 查看
  BST就是二叉检索树,或者是二叉排序树,或者叫二叉搜索树等等。

  BST的平衡问题可以去学习AVL树或者Treap或者Splay这些平衡树。

  BST的一些高级应用:

  1,求BST中比k小的数的个数:

  只需在BST上面多维护值size,表示当前这个节点的子树的点的个数。

  伪代码如下:

BST tree;

int getCou(int k) {
Node * u=tree.root;
int ret=0;

while(u!=NULL) {
if(u->val<k) {            // 如果当前节点值小于k,那么左子树也符合。
ret+=1+size(u->left);
u=u->right;
}
else u=u->left;            // 如果大于等于k的话,右子树一定不符合。
}

return ret;
}


  复杂度是logN的。

  2,求BST中第x小的数是几?

  仍然需要维护size数组。

  如果左子树点的个数超过x了,说明第x个在左子树,否则在右子树。

BST tree;

int getXth(int x) {
Node * u=tree.root;

while(u!=NULL) {
if(size(u->left)<x) {            // 如果左子树个数不足x,递归找右子树。
x-=size(u->left)+1;            // 递归时在x要变化。
if(x==0) return u;            // 找到了。

u=u->right;
}
else u=u->left;                    // 递归找左子树。
}

return -1;
}


  复杂度logN。

  3,找到BST中正好比k大的第一个数:

  仍然是从root开始找。

  代码如下:

BST tree;

int find(int k) {
Node * u=tree.root;
int ret=INF;

while(u!=NULL) {
if(u->val>k) {            // 如果当前节点大,那么他的右子树都比当前节点大,答案一定不如当前节点的值优。
ret=min(ret,u->val);
u=u->left;
}
else u=u->right;        // 左子树都小,都不符合,所以找右子树去。
}

return ret;
}


  复杂度 logN 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: