在树数据结构中交换根的2个子节点指针

时间:2018-04-10 21:17:43

标签: c++ pointers tree

我创建了一个以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;
}

2 个答案:

答案 0 :(得分:3)

您没有从输出的根交换指针。
交换方式会影响单独的变量,但树中没有任何内容 即你交换初始化树内指针的变量。

更改这样的交换部分应该会有所帮助。

temp=root->left;
root->left=root->right;
root->right=temp;

你也可以将复制(从单独的变量转移到树内的指针)到交换这些变量之后,但这可能不是你的问题的目标。

参考您的评论(表示您希望交换代码具有交换效果而不更改它):
你好像在想指针。如果节点的左侧和右侧指向指针(指向节点),那么将这些指针更改为节点将产生所需的效果。
但这看起来很不寻常,除了指针指向指针之外还需要动态分配指针......

答案 1 :(得分:1)

代码中的错误是您已交换局部变量lefttrightt的值。此交换不会影响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);