Балансировка двоичного дерева поиска (BST)C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Балансировка двоичного дерева поиска (BST)

Сообщение Anonymous »

Я пытаюсь создать функцию Balance_bst(bstNode root), но у меня возникают проблемы с реализацией.

Я реализую эту функцию как шаблон функция, так как мой класс bstNode является шаблонным классом.

Вот (часть) моего кода:

Код: Выделить всё

template
class bstNode{
public:
//Constructor
bstNode(const Item& init_data = Item(), const Key& init_key = Key(), bstNode* l_child = NULL, bstNode* r_child = NULL){
data_field = init_data;
key_field = init_key;
l_ptr = l_child;
r_ptr = r_child;
}
//Destructor
~bstNode(){
data_field = 0;
key_field = 0;
l_ptr = r_ptr = NULL;
}
//Basic Member Functions
bstNode*& left( )   {                    return l_ptr;       }           //returns left child pointer by reference
bstNode*& right( )  {                    return r_ptr;       }           //returns right child pointer by reference
bstNode* left( ) const   {               return l_ptr;       }       //returns left child pointer by reference
bstNode* right( ) const  {               return r_ptr;       }       //returns right child pointer by reference
const Item& data() const{                           return data_field;  }           //returns reference to data_field
const Key& key()const {                             return key_field;   }
Item& data() {                                      return data_field;  }           //returns reference to data_field
Key& key() {                                        return key_field;   }
void set_data(const Item& new_data){            data_field = new_data;      }       //sets data_field to new_data
void set_key(const Key& new_key){               key_field = new_key;        }       //sets key_field to new_key
void set_left(bstNode* new_left){               l_ptr = new_left;           }       //sets left child pointer to new_left
void set_right(bstNode* new_right){             r_ptr = new_right;          }       //sets right child pointer to new_right

private:
bstNode  *l_ptr,     //pointer to left child node
*r_ptr;     //pointer to right child node
Item    data_field;
Key     key_field;
};

template
void balance_bst(bstNode*& root){                //unfinished

std::vector< bstNode* > nodes;
sorter(root, nodes);
size_t i = nodes.size()/2;                      //size() divided by 2 will yield
//index of middle element of vector for
//odd-isized arrays and the greater of the
//middle two elements for an even-sized array

while(i>=0){
root->set_key(nodes[i]->key());
root->set_data(nodes[i]->data());
//.....MORE CODE HERE: recursive call??

}

}

template
void sorter(bstNode*& root, std::vector& tree_nodes){
if(root == NULL)
return;
sorter(root->left(), tree_nodes);
tree_nodes.push_back(root);
sorter(root->right(), tree_nodes);
}
Я возился с настоящей функцией Balance_bst и думаю, что рекурсия - очевидное решение, но я не могу уяснить это...

Сортировщик в основном вставляет элементы BST в вектор, используя алгоритм упорядоченной обработки. Таким образом, пока «корень» является указателем на корень двоичного дерева поиска (т.е. все ключевые значения левого поддерева узлов меньше ключевого значения узлов, а все ключевые значения правого поддерева узлов больше, чем узлы), то узлы, вставленные в вектор, будут отсортированы по возрастанию.

Затем, чтобы создать сбалансированное дерево, я вставляю узел в центр вектора в корне дерева, а затем иметь возможность рекурсивно вставлять левый и правый дочерние узлы, которые тогда будут находиться в середине левой половины вектора и середине правой половины вектора.

Примечание: я понимаю, что здесь используется целочисленное деление и, скажем, 7/2 = 3, что будет индексом среднего элемента массива размером 7. И для четного массивов размера -, алгоритм, реализованный выше, найдет индекс большего из двух элементов в середине вектора.

В любом случае, любые предложения или наблюдения приветствуются и поощряется! Заранее спасибо.

Редактировать: я спрашиваю, как реализовать функцию для балансировки двоичного дерева поиска?
(Сбалансированный BST — это тот, который имеет минимальную глубину это возможно, учитывая количество узлов.)

Подробнее здесь: https://stackoverflow.com/questions/104 ... h-tree-bst
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»