二叉排序树BST

二叉排序树(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基本没啥用,打个基础。


猜你喜欢

转载自blog.csdn.net/Binary_Heap/article/details/79304482