我创建了一个以root为5的二叉树,然后我将其左边节点创建为6,将右边节点创建为7.此外,我在两个指针(左子指针和右子指针)之间执行交换,我预期要交换的根的两个子节点(因为root的左子节点是lefft,后来我把它等同于rightt)。我的想法中是否有任何概念上的错误?我在这里想到的关于指针的内容是什么?
#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;
}
答案 0 :(得分:3)
您没有从输出的根交换指针。
交换方式会影响单独的变量,但树中没有任何内容
即你交换初始化树内指针的变量。
更改这样的交换部分应该会有所帮助。
temp=root->left;
root->left=root->right;
root->right=temp;
你也可以将复制(从单独的变量转移到树内的指针)到交换这些变量之后,但这可能不是你的问题的目标。
参考您的评论(表示您希望交换代码具有交换效果而不更改它):
你好像在想指针。如果节点的左侧和右侧指向指针(指向节点),那么将这些指针更改为节点将产生所需的效果。
但这看起来很不寻常,除了指针指向指针之外还需要动态分配指针......
答案 1 :(得分:1)
代码中的错误是您已交换局部变量leftt
和rightt
的值。此交换不会影响root
节点的成员变量。
如果您创建一个辅助函数来设置节点的左子节点:
void set_children(node* root, node* leftt, node* rightt)
{
root->left = leftt;
root->right = rightt;
}
然后在main
中,您可以设置root:
set_children(root, leftt, rightt);
然后交换就可以这样完成:
set_children(root, root->right, root->left);
也可以编写辅助函数来执行此交换。
void swap_children(node* n)
{
set_children(n, n->right, n->left);
}
那么,在main
,你会这样做:
swap_children(root);