Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- // дефинираме тип - указател към структурата node
- typedef struct node *po;
- // създаване на структурата node
- struct node {
- int data;
- po left, right;
- };
- po root;
- int userInput;
- // функция за създаване или вмъкване в ДДП
- void searchInsert(int x) {
- // деклариране на елементи от тип указатели към node
- // loc - намира мястото за вмъкване
- // insert - помощен указател
- po insert, loc;
- // стартираме от началото на структурата
- loc = root;
- // ако дървото е празно
- if( !loc ) {
- loc = new node; // създаваме нов елемент
- loc->data = x; // записваме в него стойността x
- loc->left = NULL; // създаваме ляв празен син
- loc->right = NULL; // както и десен празен син
- root = loc; // вече дървото сочи към 1вият си елемент
- }
- // ако дървото не е празно
- else{
- // докато съществува следващ елемент
- while( loc ){
- // помощният елемент съхранява моментната позиция
- // докато loc търси следваща позиция
- insert = loc;
- // Ако даденият елемент е равен на подадения
- // от потребителя - функцията се прекратява
- if( loc->data==x ) {
- return;
- }
- // в противен случай, ако даденият елемент е
- // по-голям от зададения от потребителя
- // търсенето на позиция се премества в левия син
- else if( loc->data>x ) {
- loc = loc->left;
- }
- // в противен случай
- // търсенето се премества в десния син
- else {
- loc = loc->right;
- }
- }
- // ако сме достигнали до свободно място
- // вмъкваме елемента като нов лист
- if( !loc ){
- loc = new node;
- loc->data = x;
- loc->left = NULL;
- loc->right = NULL;
- // и закачаме предишния елемент,
- // към новосъздадения лист
- if( insert ){
- if( insert->data>x ) insert->left = loc;
- else insert->right = loc;
- }
- }
- }
- }
- void print_tab(int n){
- for(int i=0;i<n;i++){
- cout<<" ";
- }
- }
- void print_tree(node* n,int tab){
- if(n->right != NULL){
- print_tree(n->right,tab+1);
- }
- print_tab(tab);
- cout<<n->data<<endl;
- if(n->left != NULL){
- print_tree(n->left,tab+1);
- }
- }
- // функция за ИНФИКСНО разпечатване
- // ЛЯВО - КОРЕН - ДЯСНО
- void infix(node* n) {
- if(n) {
- infix(n->left);
- cout<< n->data << " ";
- infix(n->right);
- }
- }
- // функция за ПРЕФИКСНО разпечатване
- // КОРЕН - ЛЯВО - ДЯСНО
- void prefix(node* n) {
- if(n) {
- cout<< n->data << " ";
- prefix(n->left);
- prefix(n->right);
- }
- }
- // функция за ПОСТФИКСНО разпечатване
- // ЛЯВО - ДЯСНО - КОРЕН
- void postfix(node* n) {
- if(n) {
- postfix(n->left);
- postfix(n->right);
- cout<< n->data << " ";
- }
- }
- // функция за търсене в ДДП
- po search(int x, po n) {
- // ако достигнем до дъното и
- // не е намерен такъв елемент връщаме NULL
- if(!n) return NULL;
- // ако е намерен, връщаме указател към даденият възел
- if(n->data == x) return n;
- // в противен случай, ако даденият елемент е по-голям от търсения
- // търсим в лявото поддърво
- else if(n->data>x) return search(x, n->left);
- // в противен случай - търсим в вясното поддърво
- else return search(x, n->right);
- }
- int main () {
- while( cin>>userInput ) {
- if(userInput == 999) break;
- searchInsert(userInput);
- }
- print_tree(root, 3);
- // принтиране на стойностите
- infix(root);
- cout << endl;
- prefix(root);
- cout << endl;
- postfix(root);
- cout << endl;
- po result = search(3, root);
- if(result) cout << "element " << result->data << " found!" << endl;
- else cout << "element not found!" << endl;
- return EXIT_SUCCESS;
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment