我正在尝试创建一个balance_bst(bstNode root)函数,但我正在努力实现 .
我正在将该函数实现为模板函数,因为我的bstNode类是一个模板类 .
这是(部分)我的代码:
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);
}
我一直在搞乱实际的balance_bst函数,并认为递归是明显的解决方案,但我似乎无法绕过这个...
sorter基本上使用inorder处理算法将BST的元素插入到矢量中 . 因此,只要“root”是指向二叉搜索树的根的指针(即节点左子树的所有键值都小于节点的键值,并且节点右子树的所有键值都大于然后,插入到向量中的节点将以升序方式进行分类 .
然后,为了创建一个 balancer 的树,我将节点插入树的根处的向量的中心,然后应该能够递归地插入左和右子节点,然后这些节点将位于左半部的中间向量和向量的右半部分的中间 .
注意:据我所知,这是使用整数除法,即7/2 = 3,这将是大小为7的数组的中间元素的索引 . 对于偶数大小的数组,上面实现的算法将找到向量中间两个元素中较大者的索引 .
无论如何,欢迎并鼓励任何建议或观察!提前致谢 .
编辑:我要问的是如何实现一个功能来 balancer 二叉搜索树? ( balancer 的BST是指给定节点数量的最小深度 . )
1 回答
balancer 二叉搜索树也称为AVL树 .
This wikipedia link对解决 balancer 问题有很好的解释 .
我发现在插入过程中 balancer 树的最简单方法 . 这是一个带有辅助函数(用于各种旋转情况)和AVLNode类的递归插入 .
助手功能
AVLNode类
希望这可以帮助!