想了好几天了,就是想不通,请指教。

回复帖子

@yipima2016 2019-06-12 20:09 回复

想了很多天,又重新去看了指针、链表,但就是理解不了。跪求各位大神指教。 在建立二叉树的函数createBiTree里,为什么参数里是&T?而不是T?&T是地址,T同样也是指向结点的地址值啊!不论&T和T, T = new BiTreeNode;是不是修改的是同一个地址里的值?

#include<iostream>
using namespace std;
typedef struct node
{
    struct node *lchild;
    struct node *rchild;
    char data;
}BiTreeNode, *BiTree;     
//按照前序顺序建立二叉树
void createBiTree(BiTree &T) 
{                        
    char c;
    cin >> c;
    if('#' == c)         
        T = NULL;
    else
    {
        T = new BiTreeNode;
        T->data=c;
        createBiTree(T->lchild);
        createBiTree(T->rchild);
    }
}

//前序遍历二叉树并打印
void preTraverse(BiTree T)
{
    if(T)
    {
        cout<<T->data<<" ";
        preTraverse(T->lchild);
        preTraverse(T->rchild);
    }
}
//中序遍历二叉树并打印
void midTraverse(BiTree T)
{
    if(T)
    {
        midTraverse(T->lchild);
        cout<<T->data<<" ";
        midTraverse(T->rchild);
    }
}
//后续遍历二叉树并打印
void postTraverse(BiTree T)
{
    if(T)
    {
        postTraverse(T->lchild);
        postTraverse(T->rchild);
        cout<<T->data<<" ";
    }
}
int main()
{
    BiTree T;      
    createBiTree(T);
    preTraverse(T);
    cout<<endl;
    midTraverse(T);
    cout<<endl;
    postTraverse(T);
    return 0;
}

再如:在swap函数里,参数有两种方式 方式一:

void swap(int * a,int * b)
{
    int t;
    t=*a;*a=*b;*b=t;
}
int main()
{
    int x=1,y=2;
    swap(&a,&b);
    cout<<a<<' '<<b<<endl;
    return 0;
}
方式二:
void swap(int &a,int &b)
{
    int t;
    t=a;a=b;b=t;
}
int main()
{
    int x=1,y=2;
    swap(a,b);
    cout<<a<<' '<<b<<endl;
    return 0;
}

那么在建立二叉树时,可以和上述方式一一样吗?

void creatBiTree(BiTreeNode * T)
{...}
int main()
{
    creatBiTree(&T);
}

我已经很多天没有好好睡觉了,拯救一下我吧。谢谢了。

@zl_just 2019-06-12 20:20 回复 举报

@yipima2016 我学指针$Treap$是也有同样的疑问
指针与指针引用的区别
如果是指针T,那你T=NULL就是将该指针指向了空指针 如果是指针引用 T=NULL就是 作为一颗节点的儿子,将它的指针指向了空指针,影响该节点

@guoxinyugz 2019-06-12 21:06 回复 举报

由于这些真的让人头晕(尤其我这种弱的人),我几乎从不用指针

反馈
如果你认为某个帖子有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。