二叉树交换左右子树问题

newvilla 2008-10-21 11:32:57
typedef struct BiTNode {
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

void exchange(BiTree t)
{BiTree p;
if (t!=NULL)
{p=t->lchild;
t->lchild=t->rchild;
t->rchild=p;
exchange(t->lchild);
exchange(t->rchild);
}
}

这个函数可以正常执行交换左右子树的操作,但是这里我想问一下,这里用值传递的方式而不是引用或者指向指针的指针方式为什么可以达到效果??个人觉得应该是void exchange(BiTree &t)

...全文
1444 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjfreeubuntu 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 newvilla 的帖子:]
typedef struct BiTNode {   
    char data;   
    struct BiTNode *lchild,*rchild;   
} BiTNode,*BiTree;

void exchange(BiTree t)
{BiTree p;
if (t!=NULL)
{p=t->lchild;
  t->lchild=t->rchild;
  t->rchild=p;
  exchange(t->lchild);
  exchange(t->rchild);
  }
}

这个函数可以正常执行交换左右子树的操作,但是这里我想问一下,这里用值传递的方式而不是引用或者指向指针的指针方式为什么可以达到效…
[/Quote]

好帖 顶。。。。。。
newvilla 2008-10-23
  • 打赏
  • 举报
回复
这个可以这样理解吗?
我传进去的是一个指向BiTNode的指针BiTree p ,函数会产生一个BiTree p的副本BiTree tmp, 整个程序只是在对BiTree tmp进行操作,但是BiTree p原来指向哪里,现在还指向哪里,但是对BiTree tmp的操作过程中把BiTree p下面的左右子树已经完成了交换,所以程序成功了!不知道这样理解对吗?
touta 2008-10-22
  • 打赏
  • 举报
回复
建议楼主找些
叙述stdcall、fastcall区别的文章看看
piaomiaoju 2008-10-22
  • 打赏
  • 举报
回复
无论你传什么,肯定要传进去一个值(本质上),至于传右值是值拷贝,传左值是为了引用对象
piaomiaoju 2008-10-22
  • 打赏
  • 举报
回复
BiTree 是指针但是在这里是当作值传递的方式用的,想要修改一个值只要修改它的指针,但是想要修改一个指针应该用指针的引用或者指向指针的指针吧?这里应该是后一种情况吧?
===========================================
你当然可以把传值和传引用都当成传'值',但是这里不是修改指针,而是修改指针所指向的对象,你把指针传进去,就是把对象的地址传进出,操作对象地址自然可以修改对象.
xianyuxiaoqiang 2008-10-22
  • 打赏
  • 举报
回复
注意typedef。对初学者确实有迷惑性。
pingzi_1119 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lann64 的回复:]
交换有两个方式:
首先,我们假设pa指向地址X,X里面的内容是A,pb指向Y地址,里面内容是B。
pa-->X (A)
pb-->Y (B)
------------
一种是交换成
pa-->Y(B)
pb-->X(A)
也就是改变指针的指向。
-------------
另一种是
pa-->X(B)
pb-->Y(A)
也就是指针指向不变,但把指向地址里面的内容交换了
---------------------
楼主的程序是采用第二种交换,楼主的疑惑是为什么没采用第一种交换。其实解决问题…
[/Quote]

昆仑大鹏
厉害啊!!!
学习了。。。。。
  • 打赏
  • 举报
回复
学习……
lann64 2008-10-22
  • 打赏
  • 举报
回复
交换有两个方式:
首先,我们假设pa指向地址X,X里面的内容是A,pb指向Y地址,里面内容是B。
pa-->X (A)
pb-->Y (B)
------------
一种是交换成
pa-->Y(B)
pb-->X(A)
也就是改变指针的指向。
-------------
另一种是
pa-->X(B)
pb-->Y(A)
也就是指针指向不变,但把指向地址里面的内容交换了
---------------------
楼主的程序是采用第二种交换,楼主的疑惑是为什么没采用第一种交换。其实解决问题的办法本来就不只一种嘛。
太乙 2008-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 newvilla 的回复:]
BiTree 是指针但是在这里是当作值传递的方式用的,想要修改一个值只要修改它的指针,但是想要修改一个指针应该用指针的引用或者指向指针的指针吧?这里应该是后一种情况吧?
[/Quote]

这里咋会是当值传递呢??
newvilla 2008-10-21
  • 打赏
  • 举报
回复
BiTree 是指针但是在这里是当作值传递的方式用的,想要修改一个值只要修改它的指针,但是想要修改一个指针应该用指针的引用或者指向指针的指针吧?这里应该是后一种情况吧?
chlaws 2008-10-21
  • 打赏
  • 举报
回复
注意BiTree 是指针...
wuyu637 2008-10-21
  • 打赏
  • 举报
回复
BiTree 是一个指针。

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧