Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交换树数据结构中根的两个子节点指针_C++_Pointers_Tree - Fatal编程技术网

C++ 交换树数据结构中根的两个子节点指针

C++ 交换树数据结构中根的两个子节点指针,c++,pointers,tree,C++,Pointers,Tree,我创建了一个以5为根的二叉树,然后将其左节点创建为6,右节点创建为7。此外,我在两个指针(左子指针和右子指针)之间执行了交换,我希望根的两个子节点进行交换(因为根的左子节点是lefft,后来我将其等同于right)。我的思维中有没有概念上的错误?关于指针,我遗漏了什么 #include<bits/stdc++.h> using namespace std; struct node{ int data; struct node* left; struct no

我创建了一个以5为根的二叉树,然后将其左节点创建为6,右节点创建为7。此外,我在两个指针(左子指针和右子指针)之间执行了交换,我希望根的两个子节点进行交换(因为根的左子节点是lefft,后来我将其等同于right)。我的思维中有没有概念上的错误?关于指针,我遗漏了什么

#include<bits/stdc++.h>
using namespace std;

struct node{
    int data;
    struct node* left;
    struct node* right;
};
struct node* newNode(int value){
    struct node* temp=(node*)malloc(sizeof(node));
    temp->left=temp->right=NULL;
    temp->data=value;
    return temp;
}

int main()
{
   // ios_base::sync_with_stdio(false);cin.tie(NULL);
    struct node* root=newNode(5);
    struct node* leftt=newNode(6);
    struct node* rightt=newNode(7);
    root->left=leftt;
    root->right=rightt;
    cout<<root->data<<" "<<root->left->data<<" "<<root->right->data<<" ";//prints 5 6 7 (expected)
    cout<<'\n';
    struct node* temp;
    temp=leftt;
    leftt=rightt;
    rightt=temp;
    cout<<root->data<<" "<<root->left->data<<" "<<root->right->data<<'\n';//prints 5 6 7. Shouldn't it print 5 7 6?
return 0;
}
#包括
使用名称空间std;
结构节点{
int数据;
结构节点*左;
结构节点*右;
};
结构节点*新节点(int值){
结构节点*temp=(节点*)malloc(sizeof(节点));
临时->左=临时->右=空;
温度->数据=值;
返回温度;
}
int main()
{
//ios_base::与stdio同步(false);cin.tie(NULL);
结构节点*root=newNode(5);
结构节点*leftt=newNode(6);
结构节点*rightt=newNode(7);
根->左=左;
根->右=右;

cout您没有交换从根目录输出的指针。
交换它的方式会影响单独的变量,但不会影响树中的任何变量。
也就是说,在树中交换初始化指针的变量

像这样更改交换部件应该会有所帮助

temp=root->left;
root->left=root->right;
root->right=temp;
您也可以在交换这些变量之后将复制(从单独的变量到树中的指针)移动到,但这可能不是问题的重点,也不是问题的目标

参考您的注释(表示您希望交换代码具有交换效果而不进行更改):

您似乎在考虑指向指针的指针。如果从一个节点向左和向右指向指针(指向节点),则将这些指针更改为节点将产生所需的效果。

但这似乎很不寻常,需要动态分配指针以及带有指向指针的节点。

您没有从根目录交换输出的指针。
交换它的方式会影响单独的变量,但不会影响树中的任何变量。
也就是说,在树中交换初始化指针的变量

像这样更改交换部件应该会有所帮助

temp=root->left;
root->left=root->right;
root->right=temp;
您也可以在交换这些变量之后将复制(从单独的变量到树中的指针)移动到,但这可能不是问题的重点,也不是问题的目标

参考您的注释(表示您希望交换代码具有交换效果而不进行更改):

您似乎在考虑指向指针的指针。如果从一个节点向左和向右指向指针(指向节点),则将这些指针更改为节点将产生所需的效果。

但这似乎不寻常,需要动态分配指针,以及带有指向指针的指针的节点…

代码中的错误是您交换了局部变量
leftt
rightt
的值。此交换不会影响
根节点的成员变量

如果创建辅助函数来设置节点的左、右子级:

void set_children(node* root, node* leftt, node* rightt)
{
    root->left = leftt;
    root->right = rightt;
}
然后在
main
中,您可以使用以下设置根目录:

set_children(root, leftt, rightt);
然后交换可以这样做:

set_children(root, root->right, root->left);
还可以编写一个helper函数来执行此交换

void swap_children(node* n)
{
    set_children(n, n->right, n->left);
}
因此,在
main
中,您将执行以下操作:

swap_children(root);

代码中的错误是您交换了局部变量
leftt
right
的值。此交换不会影响
根节点的成员变量

如果创建辅助函数来设置节点的左、右子级:

void set_children(node* root, node* leftt, node* rightt)
{
    root->left = leftt;
    root->right = rightt;
}
然后在
main
中,您可以使用以下设置根目录:

set_children(root, leftt, rightt);
然后交换可以这样做:

set_children(root, root->right, root->left);
还可以编写一个helper函数来执行此交换

void swap_children(node* n)
{
    set_children(n, n->right, n->left);
}
因此,在
main
中,您将执行以下操作:

swap_children(root);

你没有交换从你输出的根的指针。TeMP= LeTTT等,你不需要交换指针。你想要TMP = root -左,等等。给出的代码最简单的交换方式是:<代码>根>左=右;根->右=左;;/代码>,但是这不是很有教育意义…不要垃圾邮件标签!这显然不是C,但是坏的C++风格。你没有把交换的指针从你输出的根。Timp = LeFTT等,不需要交换指针。你想要TMP =根-左。等你有了代码,最直接的交换方式是:<代码>根-左=右;根-右=左。;/代码>,但是这不是很有教育意义…不要垃圾邮件标签!这显然不是C,而是坏的风格C++。叶s、 这个(你提到的)我的意思是我将root->left设置为指针,当指针指向其他对象时,root->left是否也应该更改,而不将其称为root->left?因为这样,我就不需要root更改其左子项或右子项。如果您发现我的想法中有一些概念性错误,请让我知道。您似乎在考虑指针到指针。如果左和右从一个节点指向指向指向节点的指针,那么更改这些指针将产生所需的效果。但这是非常不寻常的,除了节点外,还需要动态分配指针用指针指向指针…是的,我也这么想,我发现我错在哪里了。那么你的意思是,这两个答案都没有帮助你?是的,这(你提到的)我的意思是我将root->left设置为指针,当指针指向其他对象时,root->left是否也应该更改,而不将其称为root->left?因为这样,我就不需要root更改其左子项或右子项。如果您发现我的思维有一些概念上的错误,请让我知道。你似乎