木子dn
2021-12-12 16:29
采纳率: 0%
浏览 19

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

先看问题的描述

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的值从而错误的修改了树上的值。

求大铑解答

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

2条回答 默认 最新

  • 木子dn 2021-12-12 17:07

    我好像想明白了,灵感来源我之前的一篇文章,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是无效的。只能一个一个赋值了

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题