Equilibrando uma Árvore de Busca Binária (BST)

Eu estou tentando fazer uma função balance_bst (bstNode root), mas estou lutando com a implementação.

Estou implementando a função como uma função de modelo, já que minha classe bstNode é uma classe de modelo.

Aqui está (alguns de) meu código:

<code>template<class Item, class  Key>
class bstNode{
public:
    //Constructor
    bstNode(const Item& init_data = Item(), const Key& init_key = Key(), bstNode<Item, Key>* l_child = NULL, bstNode<Item, Key>* 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<Item, Key>*& left( )   {                    return l_ptr;       }           //returns left child pointer by reference
    bstNode<Item, Key>*& right( )  {                    return r_ptr;       }           //returns right child pointer by reference
    bstNode<Item, Key>* left( ) const   {               return l_ptr;       }       //returns left child pointer by reference
    bstNode<Item, Key>* 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<Item, Key>  *l_ptr,     //pointer to left child node 
                        *r_ptr;     //pointer to right child node
    Item    data_field;
    Key     key_field;
};

template<class Item, class Key>
void balance_bst(bstNode<Item, Key>*& root){                //unfinished

    std::vector< bstNode<Item, Key>* > 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<class Item, class Key>
void sorter(bstNode<Item, Key>*& root, std::vector<bstNode<Item, Key>* >& tree_nodes){
    if(root == NULL)
        return;
    sorter(root->left(), tree_nodes);
    tree_nodes.push_back(root);
    sorter(root->right(), tree_nodes); 
}
</code>

Eu tenho mexido com a função balance_bst, e acho que a recursão é a solução óbvia, mas eu não consigo envolver minha cabeça nessa ...

classificador basicamente insere os elementos de um BST em um vetor usando um algoritmo de processamento dentro da ordem. Portanto, desde que "root" seja um ponteiro para a raiz de uma árvore de pesquisa binária (ou seja, todos os valores de chave de uma subárvore esquerda de nós são menores que o valor de chave dos nós e todos os valores de chave da subárvore direita são maiores que nós) então os nós inseridos no vetor serão classificados de maneira ascendente.

Em seguida, para criar uma árvore balanceada, insiro o nó no centro do vetor na raiz da árvore e, em seguida, devo inserir recursivamente os nós filhos direito e esquerdo, que então estarão no meio da metade esquerda. do vetor e meio da metade direita do vetor.

Nota: Eu entendo que isso está usando a divisão de inteiros e que diz, 7/2 = 3, que seria o índice do elemento do meio de uma matriz de tamanho 7. E para matrizes de tamanho uniforme, o algoritmo implementado acima encontrará o índice do maior dos dois elementos no meio do vetor.

De qualquer forma, quaisquer sugestões ou observações são bem-vindas e incentivadas! Desde já, obrigado.

Edit: O que estou perguntando é como eu implementar uma função para equilibrar uma árvore de pesquisa binária? (Um BST balanceado é aquele que tem a profundidade mínima que pode receber o número de nós.)

questionAnswers(1)

yourAnswerToTheQuestion