二叉平衡树的左旋操作,想通过地址改变结点,产生了一个很头疼的问题。

先看问题的描述

img

这是成功的代码

#include<iostream>
#include<cstdio>
#include<cstdlib>

using namespace std;

struct node
{
    int data=0;
    node* left=NULL;
    node* right=NULL;
};

void preOrder(node *p)//先序递归
{
    if(p!=NULL)
    {
        printf("%d\n",p->data);
        preOrder(p->left);
        preOrder(p->right);
    }
}

void leftRotate(node* &p)//左旋
{
    node* left=p->left;
    node* right=p->right;
    p->right=right->left;
    right->left=p;
    p=right;
    printf("左旋之后地址变为===%p\n",p);
}


void func1(node* &p,node* t)
{
    // node* &test=t;
    // printf("作为参考的地址=====%p\n",p);
    printf("传入左旋操作的地址=%p\n",p);
    leftRotate(p);
}

int main()
{
    node* t1=(node*)malloc(sizeof(node));
    node* t2=(node*)malloc(sizeof(node));
    node* t3=(node*)malloc(sizeof(node));
    t1->data=111;
    t2->data=222;
    t3->data=333;
    t1->right=t2;
    t2->right=t3;

    printf("操作之前先序输出\n");
    preOrder(t1);

    printf("操作之前t1地址=====%p\n",t1);

    func1(t1,t1);

    printf("操作之后t1地址变为=%p\n",t1);

    printf("操作之后先序输出\n");
    preOrder(t1);

    return 0;
}

以及成功的输出

img

接下来是失败的代码,疑惑在这里产生

#include<iostream>
#include<cstdio>
#include<cstdlib>

using namespace std;

struct node
{
    int data=0;
    node* left=NULL;
    node* right=NULL;
};

void preOrder(node *p)//先序递归
{
    if(p!=NULL)
    {
        printf("%d\n",p->data);
        preOrder(p->left);
        preOrder(p->right);
    }
}

void leftRotate(node* &p)//左旋
{
    node* left=p->left;
    node* right=p->right;
    p->right=right->left;
    right->left=p;
    p=right;
    printf("左旋之后地址变为===%p\n",p);
}


void func1(node* &p,node* t)
{
    node* &test=t;
    printf("作为参考的地址=====%p\n",p);
    printf("传入左旋操作的地址=%p\n",test);
    leftRotate(test);
}

int main()
{
    node* t1=(node*)malloc(sizeof(node));
    node* t2=(node*)malloc(sizeof(node));
    node* t3=(node*)malloc(sizeof(node));
    t1->data=111;
    t2->data=222;
    t3->data=333;
    t1->right=t2;
    t2->right=t3;

    printf("操作之前先序输出\n");
    preOrder(t1);

    printf("操作之前t1地址=====%p\n",t1);

    func1(t1,t1);

    printf("操作之后t1地址变为=%p\n",t1);

    printf("操作之后先序输出\n");
    preOrder(t1);

    return 0;
}

img

我想知道的就是怎么让test能修改到t1,t2的地址,这对我很重要,

因为其实这个提问是由另外一个比较复杂的题目提炼出来的,题目里,我需要通过t来获取这棵树上另外的一点,

然后我尝试通过node* &test=t获取到那一点的地址,从而修改那个部分,直接使用p去获取那另外的一点,

会变动p的值从而错误的修改了树上的值。

求大铑解答

我好像想明白了,灵感来源我之前的一篇文章,giao,没想到起作用了。

void fun(node* &p)

这里的p可以修改t1的地址,也可以修改t1里面的属性。p=p->right;p->data=p->right->data;都是可以生效的

void fun(node* t)

这里的t无法修改t1的地址,但可以修改其中的属性,只有t->data=t->right->data;才能生效。所以使用t=t->right去寻找其他结点不会对原数据有影响
这,是不是意味着我的问题似乎无解。?
获取树上另外一点可以使用node* t,但无法直接修改地址,如果真要完成左旋操作,只能将属性一个一个赋值过来再做相应修改。
而使用node* &p却无法获得另外一点。
确实,尝试node* &test=t从而使用test修改t1是无效的。只能一个一个赋值了

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。