算法第四版3-2Binary Search Trees With C++ Implementation

来源:互联网 发布:淘宝网开店 编辑:程序博客网 时间:2024/06/05 20:46

http://algs4.cs.princeton.edu/32bst/

/*Oct/6/2016binary search treemethod:1.total()          calculate the size of tree2.size()           calculate the size of subtree3.get(key)         return the value of the key4.put(key,value)   add node(key,value)5.floor(key)       return largest element's key which no more than k6.select(m)        return the key of the m'th element7.rank(key)        return the priority of certain key8.del(key)         delete the element of key9.print            print all elements of tree */#include<iostream>#include<string>using namespace std;class node {public:int key, value;node *l, *r;//node *a *b,not node* a,bint N;node() {l = r = NULL;}node(int k, int v) {key = k, value = v;l = r = NULL;N = 1;}// creat new nodeint getN() {return N;  //valid only when this is not NULL}};class bst :public node {private:node* root;int size(node* x) {if (x == NULL) return 0; //when x==NULL,object does not exist, illegal to call class methodelse return (*x).getN();}void print(node* x) {if (x->l != NULL) print(x->l);cout << x->key << " - " << x->value << endl;if (x->r != NULL) print(x->r);}void put(node* pa, node* x, int k, int v) {if (x == NULL) {//x = new node(k, v);if (x != root) {if (pa->key > k) pa->l = new node(k, v);  //choose left or right by keyelse pa->r = new node(k, v);}else {root = new node(k, v);}return;}else if (x->key > k) put(x, x->l, k, v);else if (x->key < k) put(x, x->r, k, v);else {x->value = v;return;}(*x).N = size(x->l) + size(x->r) + 1;}//recurrsive complementnode* floor(node* x, int k) {if (x == NULL) return NULL;if (x->key > k) return floor(x->l, k);else if (x->key == k) return x;else {node *temp = floor(x->r, k);if (temp == NULL) return x;else return temp;    //save the value of latest right seaarch}}node* select(node* x, int m) {while (x != NULL) {if (size(x->l) > m) x = x->l;else if (size(x->l) == m) return x;else {m = m - size(x->l) - 1;x = x->r;}}}int rank(node* x, int k) {int ans = 0;while (x->key != k) {if (x->key < k) {ans = ans + size(x->l) + 1;x = x->r;}else {x = x->l;}}if (x->l != NULL) ans += size(x->l);return ans;}void delmin() {root = delmin(root);  //use root=delmin(root),not delmin(root).To avoid error when root is the min element}node* delmin(node* x) {if (x->l == NULL) return x->r;x->l = delmin(x->l);x->N = size(x->l) + size(x->r) + 1;  //use size method to avoid NULL pointer errorreturn x;}node* del(node* x, int k) {if (x == NULL) return NULL;if (x->key < k) x->r = del(x->r, k);else if (x->key > k) x->l = del(x->l, k);else {if (x->l == NULL) return x->r;if (x->r == NULL) return x->l;  //deal with leftchild/rightchild=NULL as long as use lc/rcnode* t = x;  //remember x's post point_tox = min(t->r);  //change x's point_tox->r = delmin(t->r);x->l = t->l;}x->N = size(x->l) + size(x->r) + 1;return x;}node* min(node* x) {node* temp = x;while (temp->l != NULL) {temp = temp->l;}return temp;}public:bst() {root = NULL;}//int total() {//return root->N;//}int size() {return size(root);}int get(int k) {node* t = root;while (t != NULL) {if (t->key > k) t = t->l;else if (t->key < k) t = t->r;else return t->value;}return NULL;}void put(int k, int v) {put(root, root, k, v);return;}//largest element which no more than kint floor(int k) {node* x = floor(root, k);if (x == NULL) return NULL;else return x->key;}// order to keyint select(int m) {return select(root, m)->key;}// key to orderint rank(int k) {node* temp = root;return rank(temp, k);}void del(int k) {root = del(root, k);}void print() {node* temp = root;print(root);}};int main() {int a, b;bst tree;string T;while (cin >> T) {if (T == "put") {cin >> a >> b;tree.put(a, b);}if (T == "get") {cin >> a;cout << tree.get(a) << endl;}if (T == "floor") {cin >> a;cout << tree.floor(a) << endl;}if (T == "select") {cin >> a;cout << tree.select(a - 1) << endl;}if (T == "rank") {cin >> a;cout << tree.rank(a) + 1 << endl;}if (T == "delete") {cin >> a;tree.del(a);}if (T == "print") {tree.print();}}return 0;}


0 0