root; while(*curr!=NULL){ cout data){//输入值小于当前值 不能离开); }else{//输入大于当前节点 不正确); } } 插入(当前,输入); cout,c++,C++" /> root; while(*curr!=NULL){ cout data){//输入值小于当前值 不能离开); }else{//输入大于当前节点 不正确); } } 插入(当前,输入); cout,c++,C++" />

将节点附加到C+中的树+;(参考和指针帮助。) 我正在编写一个类平衡二叉树,但是我对如何使用C++中的指针和引用(直接来自java)有一些困惑。下面的代码导致segfault,因为实际上没有向树中添加节点,curr刚刚切换到新的节点。我如何使新的节点指向树上curr所指向的位置,而不仅仅是重新分配curr void BalancedTree::insert(int input) { cout << "Insert started\n"; //DEBUG Node* trailingNode; Node* curr; curr = this->root; while(curr != NULL){ cout << "Addloop\n"; //Debug if(input < curr->data){ //input smaller than current cout << "Left\n"; //DEBUG trailingNode = curr; curr = curr->left; }else{ //input larger than current node cout << "Right\n"; //DEBUG trailingNode = curr; curr = curr->right; } } insert(curr, input); cout << "test" << endl; cout << root->data << " added\n"; //DEBUG // curr->parent = trailingNode; //Set the parent size++; //Increase size } //Helper method void BalancedTree::insert(Node*& curr, int input) { curr = new Node(input); } void BalancedTree::insert(int输入) { 香根草; while(curr!=NULL){ cout data){//输入值小于当前值 不能离开; }else{//输入大于当前节点 正确; } } 插入(当前,输入); CUT可以用双指针来做。使CURR实际上引用(在C++案例中指向)需要更改的最后一个节点引用: Node ** curr; curr = &this->root; while(*curr != NULL){ cout << "Addloop\n"; //Debug if(input < (*curr)->data){ //input smaller than current cout << "Left\n"; //DEBUG trailingNode = curr; curr = &((*curr)->left); }else{ //input larger than current node cout << "Right\n"; //DEBUG trailingNode = curr; curr = &((*curr)->right); } } insert(curr, input); cout << "test" << endl; cout << root->data << " added\n"; //DEBUG // curr->parent = trailingNode; //Set the parent size++; //Increase size } //Helper method void BalancedTree::insert(Node** curr, int input) { *curr = new Node(input); } 节点**curr; curr=&this->root; while(*curr!=NULL){ cout data){//输入值小于当前值 不能离开); }else{//输入大于当前节点 不正确); } } 插入(当前,输入); cout

将节点附加到C+中的树+;(参考和指针帮助。) 我正在编写一个类平衡二叉树,但是我对如何使用C++中的指针和引用(直接来自java)有一些困惑。下面的代码导致segfault,因为实际上没有向树中添加节点,curr刚刚切换到新的节点。我如何使新的节点指向树上curr所指向的位置,而不仅仅是重新分配curr void BalancedTree::insert(int input) { cout << "Insert started\n"; //DEBUG Node* trailingNode; Node* curr; curr = this->root; while(curr != NULL){ cout << "Addloop\n"; //Debug if(input < curr->data){ //input smaller than current cout << "Left\n"; //DEBUG trailingNode = curr; curr = curr->left; }else{ //input larger than current node cout << "Right\n"; //DEBUG trailingNode = curr; curr = curr->right; } } insert(curr, input); cout << "test" << endl; cout << root->data << " added\n"; //DEBUG // curr->parent = trailingNode; //Set the parent size++; //Increase size } //Helper method void BalancedTree::insert(Node*& curr, int input) { curr = new Node(input); } void BalancedTree::insert(int输入) { 香根草; while(curr!=NULL){ cout data){//输入值小于当前值 不能离开; }else{//输入大于当前节点 正确; } } 插入(当前,输入); CUT可以用双指针来做。使CURR实际上引用(在C++案例中指向)需要更改的最后一个节点引用: Node ** curr; curr = &this->root; while(*curr != NULL){ cout << "Addloop\n"; //Debug if(input < (*curr)->data){ //input smaller than current cout << "Left\n"; //DEBUG trailingNode = curr; curr = &((*curr)->left); }else{ //input larger than current node cout << "Right\n"; //DEBUG trailingNode = curr; curr = &((*curr)->right); } } insert(curr, input); cout << "test" << endl; cout << root->data << " added\n"; //DEBUG // curr->parent = trailingNode; //Set the parent size++; //Increase size } //Helper method void BalancedTree::insert(Node** curr, int input) { *curr = new Node(input); } 节点**curr; curr=&this->root; while(*curr!=NULL){ cout data){//输入值小于当前值 不能离开); }else{//输入大于当前节点 不正确); } } 插入(当前,输入); cout,c++,C++,1)将指针初始化为NULL: Node* trailingNode = NULL; Node* curr = NULL; 2) 无需在while循环中显式检查NULL: while(curr){ 3) 调用insert(curr,input)始终使用空指针调用!即使它不为空,该指针仍然只是一个常规指针,与从中检索到它的节点没有任何关系。引用它不会解决此问题。相反,您需要创建一个新节点,并将其分配到trailingNode的左侧或右侧,例如: if (!curr->right) {

1)将指针初始化为NULL:

Node* trailingNode = NULL;
Node* curr = NULL;
2) 无需在while循环中显式检查NULL:

while(curr){
3) 调用
insert(curr,input)
始终使用空指针调用!即使它不为空,该指针仍然只是一个常规指针,与从中检索到它的节点没有任何关系。引用它不会解决此问题。相反,您需要创建一个新节点,并将其分配到trailingNode的左侧或右侧,例如:

if (!curr->right) {
    curr->right = new Node (input);
    break; // exit while
}

指针是值类型,类似于Java中的引用或int

通过引用传递变量会创建该变量的别名,因此您可以在函数中更改其值。当您执行
insert(curr,input);
时,它会修改指针变量
curr
的值,使其指向新创建的节点。Java中大致相同的情况是:

Node curr;

if([...]) {
    [...]
    curr = curr.left;
}
else {
    [...]
    curr=curr.right;
}
[...]
curr = new Node();
现在,您可以看到这实际上并没有向树中插入任何内容。现在,如果您想要一个变量来指示节点的实际
left
right
成员,而不是仅仅具有与该成员相同的值(指向相同的对象),则需要有一个指向该成员(字段)的指针由于成员是一个类型“指针<代码>节点< /代码>”,指向成员的指针必须是指针(指针指向“代码>节点< /代码>”,或者是C++符号>代码>节点**/COD>
现在,如果您将“指针指向指针”传递给函数,您可以通过它修改被引用的
成员的值。这也意味着您不需要修改
curr
的值(因此通过引用传递)-它仍将指向相同的
成员(或者可能是
BalancedTree
对象的
成员),只有该成员的值将更改为指向新创建的元素。

如果我们有以下树并尝试插入值
3

             2
            / \
       1 <--   --> 4
      / \         / \
     N   N       N   N
当树为空时,你需要处理这个问题。还有其他方法可以实现,但希望这能为你指明正确的方向

insert(input < trailingNode->data ?
           trailingNode->left :
           trailingNode->right,
       input);