Created
September 9, 2013 17:08
-
-
Save pstachula-dev/6498600 to your computer and use it in GitHub Desktop.
SDiZO, lab4 Drzewo DSW
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include<iostream> | |
| #include<time.h> | |
| #include<math.h> | |
| using namespace std; | |
| struct tree{ | |
| int key; | |
| int vist_c; | |
| tree *left, *right; | |
| }; | |
| tree *root; | |
| class Binary_tree{ | |
| public: | |
| Binary_tree(); | |
| void insert1(int); | |
| tree *insert2(tree *, tree *); | |
| void delete_tree(int); | |
| void inorder(tree *); | |
| void search(int key); | |
| tree * search2(int key); | |
| void promote(int key); | |
| void walk(tree *); | |
| void rotate_right(tree *grand_father,tree *parent,tree *child); | |
| void rotate_left(tree *grand_father,tree *parent,tree *child); | |
| void make_intermediate_list(void); | |
| void make_perfect_tree(long int N); | |
| static int ii; | |
| }; | |
| Binary_tree bt; | |
| int Binary_tree::ii = 1; | |
| Binary_tree::Binary_tree() | |
| { | |
| root = NULL; | |
| } | |
| tree * Binary_tree::insert2(tree *temp, tree *newnode) | |
| { | |
| if(temp == NULL) { | |
| temp = newnode; | |
| } | |
| else if(temp->key == newnode->key) { | |
| return temp; | |
| } | |
| else if(temp->key < newnode->key) { | |
| insert2(temp->right, newnode); | |
| if(temp->right == NULL) { | |
| ii++; | |
| temp->right = newnode; | |
| } | |
| } else { | |
| insert2(temp->left, newnode); | |
| if(temp->left == NULL) { | |
| ii++; | |
| temp->left = newnode; | |
| } | |
| } | |
| return temp; | |
| } | |
| void Binary_tree::search(int key) | |
| { | |
| tree *temp = root, *parent; | |
| if(temp == NULL) | |
| cout<<"Drzewo puste"<<endl; | |
| else { | |
| while(temp != NULL) { | |
| if(temp->key == key) { | |
| cout << "Szukany element: " << temp->key << endl; | |
| temp->vist_c += 1; | |
| return; | |
| } | |
| if(temp->key < key) { | |
| temp = temp->right; | |
| } else { | |
| temp = temp->left; | |
| } | |
| } | |
| cout << "Brak elementu\n"; | |
| } | |
| } | |
| void Binary_tree::delete_tree(int key) | |
| { | |
| tree *temp = root,*parent = root, *marker; | |
| if(temp == NULL) | |
| cout<<"Drzewo puste"<<endl; | |
| else { | |
| while(temp != NULL && temp->key != key) { | |
| parent = temp; | |
| if(temp->key < key) { | |
| temp = temp->right; | |
| } else { | |
| temp = temp->left; | |
| } | |
| } | |
| } | |
| marker = temp; | |
| if(temp == NULL) | |
| cout<<"Brak wezla"; | |
| else if(temp == root) { | |
| if(temp->right == NULL && temp->left == NULL) { | |
| root = NULL; | |
| } else if(temp->left==NULL) { | |
| root = temp->right; | |
| } else if(temp->right == NULL) { | |
| root = temp->left; | |
| } else { | |
| tree *temp1; | |
| temp1 = temp->right; | |
| while(temp1->left != NULL) { | |
| temp = temp1; | |
| temp1 = temp1->left; | |
| } if(temp1 != temp->right) { | |
| temp->left = temp1->right; | |
| temp1->right = root->right; | |
| } | |
| temp1->left = root->left; | |
| root = temp1; | |
| } | |
| } else { | |
| if(temp->right == NULL && temp->left == NULL){ | |
| if(parent->right == temp) | |
| parent->right = NULL; | |
| else | |
| parent->left = NULL; | |
| } | |
| else if(temp->left == NULL){ | |
| if(parent->right == temp) | |
| parent->right = temp->right; | |
| else | |
| parent->left = temp->right; | |
| } | |
| else if(temp->right == NULL){ | |
| if(parent->right == temp) | |
| parent->right = temp->left; | |
| else | |
| parent->left = temp->left; | |
| } else { | |
| tree *temp1; | |
| parent = temp; | |
| temp1 = temp->right; | |
| while(temp1->left != NULL){ | |
| parent = temp1; | |
| temp1 = temp1->left; | |
| } | |
| if(temp1 != temp->right){ | |
| temp->left = temp1->right; | |
| temp1->right = parent->right; | |
| } | |
| temp1->left = parent->left; | |
| parent = temp1; | |
| } | |
| } | |
| delete marker; | |
| } | |
| void Binary_tree::insert1(int n) | |
| { | |
| tree *temp = root, *newnode; | |
| newnode = new tree; | |
| newnode->left = NULL; | |
| newnode->right = NULL; | |
| newnode->key = n; | |
| root = insert2(temp, newnode); | |
| } | |
| void Binary_tree::walk(tree * x) | |
| { | |
| cout << x->key << " : Left-> "; | |
| if(x->left) | |
| cout << x->left->key; | |
| else | |
| cout << "NIL"; | |
| cout << ", Right-> "; | |
| if(x->right) | |
| cout << x->right->key; | |
| else | |
| cout << "NIL"; | |
| cout << endl; | |
| if(x->left) | |
| walk(x->left); | |
| if(x->right) | |
| walk(x->right); | |
| } | |
| void Binary_tree::inorder(tree *t) | |
| { | |
| if(root == NULL) { | |
| cout << "Drzewo puste!\n"; | |
| } else { | |
| if(t != NULL) { | |
| inorder(t->left); | |
| cout << t->key << " "; | |
| inorder(t->right); | |
| } | |
| } | |
| } | |
| void Binary_tree::rotate_right(tree* grand_father, tree* parent, tree* child) | |
| { | |
| tree *temp; | |
| if(grand_father != NULL) { | |
| if(grand_father->right == parent) | |
| grand_father->right = child; | |
| else | |
| grand_father->left = child; | |
| } else { | |
| root = child; | |
| } | |
| temp = child->right; | |
| child->right = parent; | |
| parent->left = temp; | |
| } | |
| void Binary_tree::rotate_left(tree* grand_father, tree* parent, tree* child) | |
| { | |
| tree *temp; | |
| if(grand_father != NULL) { | |
| if(grand_father->left == parent) | |
| grand_father->left = child; | |
| else | |
| grand_father->right = child; | |
| } else { | |
| root = child; | |
| } | |
| temp = child->left; | |
| child->left = parent; | |
| parent->right = temp; | |
| } | |
| tree * Binary_tree::search2(int key) | |
| { | |
| tree *temp = root, *parent, *temp2; | |
| if(temp == NULL) | |
| cout<<"Drzewo puste"<<endl; | |
| else { | |
| while(temp != NULL) { | |
| if(temp->key == key) { | |
| return temp2; | |
| } | |
| if(temp->key < key) { | |
| if(temp->right->key == key) | |
| temp2 = temp->right; | |
| temp = temp->right; | |
| } else { | |
| if(temp->right->key == key) | |
| temp2 = temp->left; | |
| temp = temp->left; | |
| } | |
| } | |
| cout << "Brak elementu\n"; | |
| } | |
| } | |
| void Binary_tree::promote(int key) | |
| { | |
| tree *temp = root, *parent, *grand_father; | |
| grand_father = search2(key); | |
| parent = search2(grand_father->key); | |
| cout << grand_father->key << endl; | |
| cout << parent->key << endl; | |
| if(parent->left->key == key) { | |
| rotate_left(grand_father, parent, parent->left); | |
| } else { | |
| rotate_right(grand_father, parent, parent->right); | |
| } | |
| } | |
| void Binary_tree::make_intermediate_list(void) | |
| { | |
| tree *temp, *temp2, *grand_father; | |
| grand_father = NULL; | |
| temp = root; | |
| while(temp != NULL) { | |
| if(temp->left != NULL) { | |
| temp2 = temp->left; | |
| rotate_right(grand_father, temp, temp->left); | |
| temp = temp2; | |
| } else { | |
| grand_father = temp; | |
| temp = temp->right; | |
| } | |
| } | |
| } | |
| void Binary_tree::make_perfect_tree(long int N) | |
| { | |
| long int i, m; | |
| tree *temp, *temp2, *grand_father; | |
| grand_father = NULL; | |
| temp = root; | |
| m = (long int)pow(2, (long int)(log(N)/log(2))) - 1; | |
| for(i = 0; i < (N - m); i++) { | |
| temp2 = temp->right; | |
| if(temp2 != NULL) { | |
| rotate_left(grand_father, temp, temp->right); | |
| grand_father = temp2; | |
| temp = temp2->right; | |
| } | |
| } | |
| while(m > 1) { | |
| m = m / 2; | |
| grand_father = NULL; | |
| temp = root; | |
| for(i = 0; i < m; i++) { | |
| temp2 = temp->right; | |
| rotate_left(grand_father, temp, temp->right); | |
| grand_father = temp2; | |
| temp = temp2->right; | |
| } | |
| } | |
| } | |
| void insert3(int n) | |
| { | |
| for(int i = 0; i < n; i = Binary_tree::ii) { | |
| int z = rand() % 200; | |
| bt.insert1(z); | |
| } | |
| } | |
| int main() | |
| { | |
| srand(time(NULL)); | |
| int choice, n, key, z; | |
| while(z){ | |
| cout << "\n1. Dodaj jeden wezel \n2. Dodaj losowe \n3. Inorder " | |
| "\n4. Usun \n5. Pokaz strukture \n6. DSW \n7. Wyszukaj \n8. Wyjscie \n9. Promocja\n"; | |
| cin >> choice; | |
| switch(choice){ | |
| case 1: | |
| cout << "Dodaj element: "; | |
| cin >> n; | |
| bt.insert1(n); | |
| break; | |
| case 2: | |
| cout<<"Ile elementow: "; | |
| cin >> n; | |
| insert3(n); | |
| break; | |
| case 3: | |
| cout << endl; | |
| bt.inorder(root); | |
| break; | |
| case 4: | |
| cout<<endl; | |
| cout <<"Jaki element chcesz usunac?: "; | |
| cin >> n; | |
| bt.delete_tree(n); | |
| break; | |
| case 5: | |
| cout << endl; | |
| bt.walk(root); | |
| break; | |
| case 6: | |
| cout << endl; | |
| bt.make_intermediate_list(); | |
| bt.make_perfect_tree(Binary_tree::ii); | |
| break; | |
| case 7: | |
| cout<<endl; | |
| cout <<"Jaki element chcesz znalezc?: "; | |
| cin >> n; | |
| bt.search(n); | |
| break; | |
| case 8: | |
| z = 0; | |
| case 9: | |
| cout << endl; | |
| cout <<"Jaki element chcesz promowac?: "; | |
| cin >> n; | |
| bt.promote(n); | |
| break; | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment