2014-07-09 215 views
1

我有一种方法将节点插入到二叉树中,该二叉树使用指向指针的指针正确分配树中的新节点。因为我使用的是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; 
} 
+0

我不看看你为什么需要双指针。只要放下一个间接。 – bolov

+0

我不太清楚,但是当我使用单个指针时,似乎我的分配是在未定义的位置完成的,就像我的根始终指向NULL一样,无论在树中插入元素。 – aajjbb

回答

2

没有测试,但是这是想法:你插入的时候你是在父母,而不是当你陷入空:

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; 
} 
0

你不能重新分配的参考,所以由于buff = &(*buff)->left;
你不能改变node** buff = &root;node*& buff = root;(和buff更换(*buff))。

+0

那么,我有义务在这里使用双指针? – aajjbb

+0

我会用'std :: unique_ptr '而不是'node *'来使用智能指针(用于免费的内存管理),所以'node ** buff'将变成'std :: unique_ptr * buff'。但是如果你保留'root'的指针,那么是的。 – Jarod42