二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。
二叉排序树的性质:左子树上所有结点的值均小于或等于它的根结点的值;右子树上所有结点的值均大于或等于它的根结点的值;左、右子树也分别为二叉排序树;
如图是一个BST。
-----------------------------------------------
有了这种性质,BST的操作就不难了
# 查找(find):找值为x的结点编号:从根开始,
if x == now 返回该结点编号
if x < now 走到左孩子(左孩子为空则返回-1)
if x > now 走到右孩子(为空则返回-1)
#插入(insert):插入value,从根开始,
if value == now now的计数++
if value < now 插入到左子树
if value > now 插入到右子树
if 当前为空 新建结点并连到上个结点
#删除(delete):删除值为value的结点
先寻找到结点. O(h)的时间,从根开始找
如果找到了:
if 无左右子树 : 删除该结点
if 只有左(or 右)子树,把子树接到父亲.
else : 在左子树里找value最大的结点,把当前结点替换成k,再删除结点k.
封装到结构体BST里了。可以参考一下。
#include <iostream>
using namespace std;
struct BST {
struct Node {
int value, cnt;
int l, r;
} tree[100010];
int size, root;
BST() {size = root = 0;}
int NewNode(int value) {
tree[++size].value = value;
tree[size].l = tree[size].r = 0;
tree[size].cnt = 1;
return size;
}
void insert(int &k, int value) {
if(!k) {
k = NewNode(value);
return;
}
if(value == tree[k].value) tree[k].value ++;
else if(value < tree[k].value) insert(tree[k].l, value);
else insert(tree[k].r, value);
}
int find(int k, int value) {
if(!k) return -1;
if(tree[k].value == value) return k;
if(tree[k].value > value) return find(tree[k].l, value);
return find(tree[k].r, value);
}
int findmax(int k) { //找以k为根的树中的MAX
if(tree[k].r == 0) return k;
return findmax(tree[k].r);
}
int del(int &x, int v) {
if(tree[x].value > v) del(tree[x].l, v);
else if(tree[x].value < v) del(tree[x].r, v);
else {
tree[x].value = 0;
if(!tree[x].l && !tree[x].r) x = 0;
else if(tree[x].l && !tree[x].r) x = tree[x].l;
else if(!tree[x].l && tree[x].r) x = tree[x].r;
else {
int max_idx = findmax(tree[x].l);
tree[x].value = tree[max_idx].value;
del(max_idx, tree[max_idx].value);
}
}
}
} bst;
int main() {
int q, opt, x, root = 0;
cout << "insert:1 x\ndelete:2 x\nfind:3 x\n----\nInput Q:\n";
cin >> q;
for(int i=1; i<=q; i++) {
cin >> opt >> x;
if(opt == 1) {
bst.insert(root, x);
}else if(opt == 2) {
bst.del(root, x);
}else if(opt == 3) {
int idx = bst.find(root, x);
if(idx == -1) cout << "Not Found\n";
else cout << "index = " << idx << endl;
}
}
return 0;
}
/*
6
1 3
1 2
1 5
1 4
2 2
3 3
*/
自制样例结果和分析
BST容易退化成链,因此就有了->SBT,Splay,Red-black tree,Treap.....
后面会学习并发表Blog的。。
意思就是普通的BST基本没啥用,打个基础。