.


:




:

































 

 

 

 


.

.

: 3

-322

: . .

2016

 

.

 

, BST - , . .

(Binary Search Tree BST) , , , .

BST - :

( ),

( ),

,

,

,

,

, , ,

, .

BST :

.

 

(, ) .

: t → L t → R t .

: ( = ).

 


3.

, , .

.

:

:

:

:

:

:

:

:

:

 

:

:

:

:

:

 

:

:

:

:

:

 

:

:

:

:

:

 

:

:

:

:

:

 

: K T

: K

: K T

: false, , true,

: T K

 

: K

:

: K

: T K

:

 

: K

: K

: c K

: true, , false,

: K

 

:

:

:

:

:

t L R

:

:

: t-L-R

:

: t-L-R

 

:

:

:

:

:


4. Tree:

Tree() //

~ Tree() //

int nodeCount() //

void clear() //

bool isClean() //

bool add(const K &key, const T &elem) //

T search(T key) //

bool removeByKey(K key) //

void print() //

void tLR() // t-L-R

int getLength() //

 

. -, .



classes.h

#ifndef __CLASSES_H__

#define __CLASSES_H__

 

template <class K, class T>

class Tree {

protected:

class Node {

public:

K key;

T item;

Node *left;

Node *right;

 

Node(K k, T i, Node *s = NULL, Node *b = NULL){

key = k;

item = i;

left = s;

right = b;

}

};

 

Node *root;

 

public:

K tmpKey;

T tmpItem;

int length;

 

Tree(){

root = NULL;

length = 0;

}

 

~Tree(){

deleteSubtree(root);

}

 

int nodeCount(){

return nodeCount_helper(root);

};

 

void clear(){

deleteSubtree(root);

root = NULL;

};

 

bool isClean(){

return (root)? true: false;

}

 

bool add(const K &key, const T &elem){

return add_helper(root, key, elem);

}

 

T search(K search){

return search_helper(root, search);

}

 

bool removeByKey(K key){

bool deleted = false;

removeByKey_helper(root, key, deleted);

 

return deleted;

};

 

void print(){

print_helper(root, 0);

}

 

void tLR(){

return tLR_helper(root);

}

 

int getLength(){

return getLength_helper(root, 1);

}

 

 

private:

int nodeCount_helper(Node *node);

bool add_helper(Node *&node, const K &key, const T &elem);

T search_helper(Node *node, K search);

Node* removeByKey_helper(Node *&root, K key, bool &deleted);

void print_helper(Node *node, int spaces);

void tLR_helper(Node *node);

int getLength_helper(Node *node, int i);

void deleteSubtree(Node *node);

Node* findMin(Node *root);

};

 

template <class K, class T>

typename Tree<K, T>::Node* Tree<K, T>::findMin(Node* root){

while(root->left!= NULL) root = root->left;

return root;

};

 

template <class K, class T>

typename Tree<K, T>::Node* Tree<K, T>::removeByKey_helper(Node *&root, K data, bool &deleted){

if(root == NULL){

return root;

} else if(data < root->key){

root->left = removeByKey_helper(root->left, data, deleted);

} else if (data > root->key){

root->right = removeByKey_helper(root->right, data, deleted);

} else {

if(root->left == NULL && root->right == NULL) {

delete root;

root = NULL;

deleted = true;

} else if(root->left == NULL && root->right!= NULL) {

Node *temp = root;

root = root->right;

delete temp;

deleted = true;

} else if(root->right == NULL && root->left!= NULL) {

Node *temp = root;

root = root->left;

delete temp;

deleted = true;

} else {

Node *temp;

if(root->right)

temp = findMin(root->right);

else

temp = root->left;

 

root->key = temp->key;

root->item = temp->item;

root->right = removeByKey_helper(root->right, temp->key, deleted);

}

}

 

return root;

};

 

template <class K, class T>

int Tree<K, T>::getLength_helper(Node *node, int i){

int local = 0;

if(!node){

return 0;

}

if(node->left && node->right)

local += i;

 

local += getLength_helper(node->left, i+1) + getLength_helper(node->right, i+1);

 

return local;

};

 

template <class K, class T>

void Tree<K, T>::tLR_helper(Node *node){

if(node){

cout << node->key << " ";

tLR_helper(node->left);

tLR_helper(node->right);

}

};

 

template <class K, class T>

int Tree<K, T>::nodeCount_helper(Node *node){

int cnt = 0;

if(node){

cnt += nodeCount_helper(node->right);

cnt += nodeCount_helper(node->left);

cnt++;

}

 

return cnt;

};

 

template <class K, class T>

void Tree<K, T>::deleteSubtree(Node *node){

if(node){

deleteSubtree(node->left);

deleteSubtree(node->right);

delete node;

}

};

 

template <class K, class T>

bool Tree<K, T>::add_helper(Node *&node, const K &key, const T &item){

if(node == NULL){

node = new Node(key, item);

return true;

} else if(key == node->key){

return false;

} else if(key < node->key){

add_helper(node->left, key, item);

} else {

add_helper(node->right, key, item);

}

};

 

template <class K, class T>

T Tree<K, T>::search_helper(Node *node, K search){

if (node == NULL){

T val;

return val;

}

 

if(node->key == search){

return node->item;

}

 

if(search <= node->key){

if(node->left!= NULL)

return search_helper(node->left, search);

} else {

if(node->right!= NULL)

return search_helper(node->right, search);

}

 

T val;

return val;

};

 

template <class K, class T>

void Tree<K, T>::print_helper(Node *node, int spaces){

while (node!= NULL){

if(node->right)

print_helper(node->right, spaces + 5);

 

for (int i = 1; i < spaces; ++i)

std::cout << ' ';

 

//std::cout << "(" << node->key << ")=" << node->item << std::endl;

std::cout << "(" << node->key << ")" << std::endl;

 

node = node->left;

spaces += 5;

}

};

#endif // __CLASSES_H__



<== | ==>
, , | 
:


: 2017-02-11; !; : 1297 |


:

:

.
==> ...

1702 - | 1651 -


© 2015-2024 lektsii.org - -

: 0.069 .