Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- class Element {
- private:
- int key;
- Element * ptr_left=nullptr;
- Element * ptr_right=nullptr;
- public:
- Element();
- Element(int key_val);
- int get_key();
- Element * get_ptr_left();
- Element * get_ptr_right();
- void set_ptr_left(int liczba);
- void set_ptr_right(int liczba);
- void set_ptr_left(Element * ptr);
- void set_ptr_right(Element * ptr);
- };
- Element::Element() {
- }
- Element::Element(int key_val) {
- key = key_val;
- }
- int Element::get_key() {
- return key;
- }
- Element * Element::get_ptr_left() {
- return ptr_left;
- }
- Element * Element::get_ptr_right() {
- return ptr_right;
- }
- void Element::set_ptr_left(int liczba) {
- ptr_left = new Element(liczba);
- }
- void Element::set_ptr_right(int liczba) {
- ptr_right = new Element(liczba);
- }
- void Element::set_ptr_left(Element * ptr) {
- ptr_left = ptr;
- }
- void Element::set_ptr_right(Element * ptr) {
- ptr_right = ptr;
- }
- class Tree {
- private:
- Element * root = nullptr;
- public:
- Tree();
- Tree(int i);
- void set_root(Element * ptr);
- void add(int key_val);
- void add_many(int num);
- bool find(int key_val,bool kom=true);
- void remove(int key_val);
- void show_pre_order();
- void show_pre_order(Element * ptr);
- void show_in_order();
- void show_in_order(Element * ptr);
- void show_post_order();
- void show_post_order(Element * ptr);
- };
- Tree::Tree() {
- }
- void Tree::set_root(Element * ptr) {
- root = ptr;
- }
- bool Tree::find(int key_val, bool kom) {
- Element * sup_ptr = root;
- if(root==nullptr){
- if (kom == true) {
- cout << "korzen jest pusty" << endl;
- }
- return false;
- }
- if (sup_ptr->get_key() == key_val) {
- if (kom == true) {
- cout << "istnieje element z podanym kluczem " << endl;
- }
- return true;
- }
- else if (sup_ptr->get_key() > key_val) {
- sup_ptr = sup_ptr->get_ptr_left();
- }
- else if (sup_ptr->get_key() < key_val) {
- sup_ptr = sup_ptr->get_ptr_right();
- }
- while (sup_ptr != nullptr) {
- if (sup_ptr->get_key() == key_val) {
- if (kom == true) {
- cout << "istnieje element z podanym kluczem " << endl;
- }
- return true;
- }
- else if (sup_ptr->get_key() > key_val) {
- sup_ptr = sup_ptr->get_ptr_left();
- }
- else if (sup_ptr->get_key() < key_val) {
- sup_ptr = sup_ptr->get_ptr_right();
- }
- }
- if (sup_ptr == nullptr) {
- if (kom == true) {
- cout << "nie ma elementu o podanym kluczu " << endl;
- }
- return false;
- }
- }
- void Tree::add(int key_val) {
- if (root == nullptr) {
- root = new Element(key_val);
- return;
- }
- bool czy_sie_powtarza = find(key_val,false);
- if (czy_sie_powtarza == true) {
- cout << "nie mozna dodac obikektu poniewaz istnieje juz jeden z takim kluczem" << endl;
- return;
- }
- Element * sup_ptr = root;
- while ((sup_ptr->get_key() > key_val && sup_ptr->get_ptr_left() != nullptr) || (sup_ptr->get_key() < key_val && sup_ptr->get_ptr_right() != nullptr)) {
- if (sup_ptr->get_key() > key_val) {
- sup_ptr = sup_ptr->get_ptr_left();
- }
- else if (sup_ptr->get_key() < key_val) {
- sup_ptr = sup_ptr->get_ptr_right();
- }
- }
- if (sup_ptr->get_key() > key_val) {
- sup_ptr->set_ptr_left(key_val);
- }
- else if (sup_ptr->get_key() < key_val) {
- sup_ptr->set_ptr_right(key_val);
- }
- }
- void Tree::add_many(int num) {
- for (int i = 0; i < num; i++) {
- int key_val = (rand() % 20)+0;
- while (find(key_val,false) == true) {
- key_val = (rand() % 20) + 0;
- }
- add(key_val);
- }
- }
- void Tree::show_pre_order(Element * ptr) {
- if (ptr == nullptr) {
- return;
- }
- else {
- cout << ptr->get_key() << endl;
- show_pre_order(ptr->get_ptr_left());
- show_pre_order(ptr->get_ptr_right());
- }
- }
- void Tree::show_pre_order() {
- show_pre_order(root);
- }
- void Tree::show_in_order(Element * ptr) {
- if (ptr == nullptr) {
- return;
- }
- else {
- show_in_order(ptr->get_ptr_left());
- cout << ptr->get_key() << endl;
- show_in_order(ptr->get_ptr_right());
- }
- }
- void Tree::show_in_order() {
- show_in_order(root);
- }
- void Tree::show_post_order(Element * ptr) {
- if (ptr == nullptr) {
- return;
- }
- else {
- show_post_order(ptr->get_ptr_left());
- show_post_order(ptr->get_ptr_right());
- cout << ptr->get_key() << endl;
- }
- }
- void Tree::show_post_order() {
- show_post_order(root);
- }
- void Tree::remove(int key_val) {
- Element * ptr = root;
- Element * par_ptr = nullptr;
- if (root == nullptr) {
- cout << "korzen jest pusty" << endl;
- return;
- }
- while (ptr != nullptr) {
- if (ptr->get_key() == key_val) {
- if (ptr->get_ptr_left() == nullptr && ptr->get_ptr_right() == nullptr) {
- if (par_ptr->get_ptr_left() == ptr) {
- delete ptr;
- par_ptr->set_ptr_left(nullptr);
- return;
- }
- else {
- delete ptr;
- par_ptr->set_ptr_right(nullptr);
- return;
- }
- }
- else if (ptr->get_ptr_left() == nullptr && ptr->get_ptr_right() != nullptr) {
- if (par_ptr->get_ptr_left() == ptr) {
- par_ptr->set_ptr_left(ptr->get_ptr_right());
- delete ptr;
- return;
- }
- else {
- par_ptr->set_ptr_right(ptr->get_ptr_right());
- delete ptr;
- return;
- }
- }
- else if ((ptr->get_ptr_left() != nullptr && ptr->get_ptr_right() == nullptr)) {
- if (par_ptr->get_ptr_left() == ptr) {
- par_ptr->set_ptr_left(ptr->get_ptr_left());
- delete ptr;
- return;
- }
- else {
- par_ptr->set_ptr_left(ptr->get_ptr_right());
- delete ptr;
- return;
- }
- }
- else if ((ptr->get_ptr_left() != nullptr && ptr->get_ptr_right() != nullptr)) {
- Element *succes_ptr = ptr->get_ptr_right();
- Element * par_succes_ptr = nullptr;
- while (succes_ptr->get_ptr_left() != nullptr) {
- par_succes_ptr = succes_ptr;
- succes_ptr = succes_ptr->get_ptr_left();
- }
- if (succes_ptr->get_ptr_right() == nullptr) {
- if (root == ptr && (ptr->get_ptr_right() == succes_ptr)) {
- }
- else {
- par_succes_ptr->set_ptr_left(nullptr);
- }
- }
- else {
- if (root == ptr && (ptr->get_ptr_right() == succes_ptr)) {
- }
- else
- {
- par_succes_ptr->set_ptr_left(succes_ptr->get_ptr_right());
- }
- }
- succes_ptr->set_ptr_left(ptr->get_ptr_left());
- if (ptr == root && (ptr->get_ptr_right()==succes_ptr)) {
- }
- else {
- succes_ptr->set_ptr_right(ptr->get_ptr_right());
- }
- if (ptr == root) {
- delete root;
- root = succes_ptr;
- return;
- }
- if (par_ptr->get_ptr_left() == ptr) {
- par_ptr->set_ptr_left(succes_ptr);
- delete ptr;
- return;
- }
- else {
- par_ptr->set_ptr_right(succes_ptr);
- delete ptr;
- return;
- }
- }
- }
- else if (ptr->get_key() > key_val) {
- par_ptr = ptr;
- ptr = ptr->get_ptr_left();
- }
- else {
- par_ptr = ptr;
- ptr = ptr->get_ptr_right();
- }
- }
- cout << "nie mozna usunac wezla poniewaz nie istnieje " << endl;
- return;
- }
- int main()
- {
- srand(time(NULL));
- Tree tree;
- tree.add(20);
- tree.add(10);
- tree.add(5);
- tree.add(30);
- tree.add(35);
- tree.add(40);
- tree.show_pre_order();
- tree.remove(30);
- cout << endl;
- tree.show_in_order();
- /*tree.add(10);
- tree.add(5);
- tree.add(4);
- tree.add(6);
- tree.add(15);
- tree.add(13);
- tree.add(16);
- tree.show();
- tree.remove(10);
- cout << endl;
- tree.show();*/
- /*tree.find(15);
- tree.find(5);
- tree.find(1);*/
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement