将指针更改为指向引用指针的指针

时间:2014-07-09 20:05:06

标签: c++ pointers

我有一个方法可以将节点插入到二叉树中,该树使用指向指针的指针在树中正确分配新节点。

由于我正在使用C ++,我认为可以将此指针更改为指向指针的指针,从而产生更清晰的C ++代码。但是如何做到这一点并保持分配正确?

bool insert(T value) {
    node** buff = &root;

    while ((*buff) != NULL) {
        if (value == (*buff)->value) {
            return false;
        } else if (value < (*buff)->value) {
            buff = &(*buff)->left;
        } else {
            buff = &(*buff)->right;
        }
    }

    *buff = new node(value);
    return true;
}

2 个答案:

答案 0 :(得分:2)

未经测试,但这是个主意:你在父母时插入,而不是在你下降为null时插入:

bool insert(T value) {
    if (root == nullptr) {
       root = new node(value);
       return true;
    }

    node* buff = root;    
    while(buff->value != value) {        
        if (value < buff->value) {
            if(buff->left == nullptr {
               buff->left = new node(value);
               return true;
            }
            buff = buff->left;
        } else {
            if (buff->right == nullptr) {
               buff->right = new node(value);
               return true;
            }
            buff = buff->right;
        }
    }

    return false;
}

我将如何写它:

// returns the node under which the insertion must be done
// or nullptr if the value already exists in the tree
// prereq: tree must be not empty
node* findParentInsertionPoint(T value) {
    if (root == nullptr) {
       throw std::logic_erro("");
    }

    node* n = root;    
    while(n->value != value) {        
        if (value < n->value) {
            if(n->left == nullptr {
               return buff;
            }
            n= n->left;
        } else {
            if (n->right == nullptr) {
               return n;
            }
            n= n->right;
        }
    }
    return nullptr;
}

// inserts a leaf as child of parent
// prereq: parent must be not null
// the corresponding child must be null;
void insertLeafAt(T value, node * parent) {
   if (parent == nullptr) {
      throw std::logic_error("");
   }
   if (value < parent->value) {
      parent->left = new node(value);
   } else {
     parent->right = new node(value);
   }
}

bool insert(T value) {
    if (root == nullptr) {
       root = new node(value);
       return true;
    }

    node* parent = findParentInsertionPoint(value);
    if (parent == nulptr) {
       return false;
    }
    insertLeafAt(T value, parent);
    return true;
}

答案 1 :(得分:0)

您无法重新分配参考,因此buff = &(*buff)->left;
您无法将node** buff = &root;更改为node*& buff = root;(并将(*buff)替换为buff)。