BiTree &T 和Bitree T

想必大家学习数据结构的时候一直会犹豫这个问题,为什么要用BiTree &T 和Bitree T。有如下定义

typedef struct Node{
	char data;
	struct Node *lchild, *rchild;
}*BiTree, Node;

//二叉排序数的插入操作
void Insert(BiTree &T, char c){
	if (T == NULL){
		T = (BiTree)malloc(sizeof(Node));
		T->data = c;
		T->lchild = T->rchild = NULL;
		return;
	}
	else if (c == T->data)
		return;
	else if (c < T->data)
		return Insert(T->lchild, c);
	else
		return Insert(T->rchild, c);
}

BiTree 本身已经是一个指针了,为什么要用Bitree &T呢?

首先明确一个问题:Bitree &T 中的&是引用,这个也就是取地址的意思,这个只有C++中才有,你也可以用C中的指针,用Bitree *T,但是这样你调用Insert时就必须这样调用Insert(&T).

这里为什么要用指针取指针T的地址呢,因为你这里要修改这个指针。试想一下,当你要在一个函数修改一个int变量的时候,你会去用fun(*p)或者funz(&i)。同理,你修改一个指针也要用指针的指针(即二级指针)或者指针的引用。

第二个问题来了,有人肯定会跟我一样,认为自己并不要修改这个指针,因为你想修改的只是这个指针T的T->lchild和T->rchild和T->data。其实,你犯了一个大错,你从来没有修改过T->lchild和T->rchild和T->data。你只是一直在修改这个T指针,你的T指针一直是NULL,而你让它指向了(BiTree)malloc(sizeof(Node))这个空间!!!即一直在修改这个T指针,调试时你会发现你的T的地址发生了变化。那么你说你是不是要用他的引用啊!

第三个问题,有人也会觉得自己一直在改变T的值,那么返回之后这个T岂不是指向了这棵树的叶子节点,这你也是多虑了,你其实每次都在递归调用,最终返回的T还是那个T。

当你用排序的时候,你用Bitree T是没问题的,因为你只需要使用这个指针,并不需要修改这个指针。

  • 25
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值