我正在努力将2个模板AVL树合并到1棵树中,两棵树中的节点数量都很复杂总数(这很棘手) - 正确的算法是建立一个完整的二叉树节点的数量总计 - 如果total等于2的幂减去1,或创建一个节点数多于总数的完整二叉树(下一个2的幂)并切断不必要的叶子(总和下一个2的幂之间的差值),而节点也是模板,应该是空的。 如何构建一个没有任何密钥比较的空节点的完整二叉树(由于节点是模板,我没有任何密钥)?
我的模板节点是:
class avl_node{
private:
friend class avl_tree;
//design to contain dinamically allocated key and data only!
//assumption- every node uses it's own data and key- no data or key are the
//same memory for different nodes!
Key *key;
T *data;
avl_node *parent;
avl_node *right;
avl_node *left;
int height;
int balance;
int maxHeight(int h1,int h2){
return (h1 > h2) ? h1:h2;
}
public:
avl_node(Key* key=nullptr, T* data=nullptr): key(key),data(data),right(nullptr),left(nullptr),parent(nullptr),height(0),balance(0){}
//no setKey since this is an invariant from node creation
virtual ~avl_node(){
delete key;
delete data;
delete right;
delete left;
}
virtual bool insert( Key* key, T* data,avl_node *& to_fix_from);
virtual avl_node * findNode(const Key& key);
virtual void updateStats() {
if(left && right){
height=maxHeight(left->height,right->height)+1;
balance=left->height-right->height;
return;
}
if(!left && right){
height=right->height+1;
balance=-right->balance;
return;
}
if(left &&!right){
height=left->height+1;
balance=left->height;
return;
}
this->height=0;
}
};
问题是 - 密钥是模板参数 - 所以我不能决定,例如,对所需节点数量进行for循环,并创建一些简单的密钥(根据for-loops'counter)并插入它 - 因为insert需要一些比较选项。
我正在编辑问题:我发现了here,我可以动态地分配一个空节点数组,并在二进制搜索中递归分配左右每个节点(在数组索引)。 新问题:我可以从指向此节点的指针逐个释放每个节点 - 尽管它们是在数组中分配的吗?因为我想只使用一个根,并将其视为具有兼容删除功能的树。
答案 0 :(得分:0)
问题并非绝对清楚,您要达到的目标是什么。构建一个完整的空树是相对简单的。此时您不需要任何密钥。它们都将为NULL。你可以这样做:
avl_node *avl_node::BuildAvlSubtree(int height_needed)
{
if (height_needed <= 0)
return nullptr;
auto node = new avl_node();
node->left = BuildAvlSubtree(height_needed-1);
node->right = BuildAvlSubtree(height_needed-1);
return node;
}
此函数应该是avl_node
类的静态成员,因为它访问私有成员。