如何使用空节点创建完整的二叉树

时间:2016-12-01 00:30:18

标签: c++ templates binary-tree

我正在努力将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,我可以动态地分配一个空节点数组,并在二进制搜索中递归分配左右每个节点(在数组索引)。  新问题:我可以从指向此节点的指针逐个释放每个节点 - 尽管它们是在数组中分配的吗?因为我想只使用一个根,并将其视为具有兼容删除功能的树。

1 个答案:

答案 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类的静态成员,因为它访问私有成员。