数据结构录 之 BST的高级应用。
2015-12-22 15:35
120 查看
BST就是二叉检索树,或者是二叉排序树,或者叫二叉搜索树等等。
BST的平衡问题可以去学习AVL树或者Treap或者Splay这些平衡树。
BST的一些高级应用:
1,求BST中比k小的数的个数:
只需在BST上面多维护值size,表示当前这个节点的子树的点的个数。
伪代码如下:
复杂度是logN的。
2,求BST中第x小的数是几?
仍然需要维护size数组。
如果左子树点的个数超过x了,说明第x个在左子树,否则在右子树。
复杂度logN。
3,找到BST中正好比k大的第一个数:
仍然是从root开始找。
代码如下:
复杂度 logN 。
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 。
相关文章推荐
- 2015年大二上-数据结构-树和二叉树-1-(1)二叉树算法库
- 数据结构录 之 单调队列&单调栈。
- 【数据结构】计数排序
- 《数据结构》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
- 【数据结构】希尔排序
- 【Linux 驱动】netfilter/iptables (二) Netfilter hook 数据结构
- 数据结构随笔
- 数据结构总结—林莉
- 数据结构总结-焦梦真
- 数据结构之线性表顺序结构
- 数据结构与算法 LeetCode编程练习--Delete Node in a Linked List
- 数据结构基础之栈
- 数据结构中各种内部排序算法的比较
- poj 食物链 数据结构 并查集
- 数据结构学期学习总结
- 数据结构基础(二)栈和队列
- 09 DirectoryStructure
- 数据结构实验之排序六:希尔排序
- UI day 14 XML JSON数据结构解析
- 数据结构2 二叉树的高度和宽度