C++中TreeNode*与TreeNode*&参数有何区别?结合LeetCode783题解答
核心差异:指针值传递 vs 指针引用传递
C++中参数传递默认是值传递,哪怕参数是指针类型也遵循这个规则,两种写法的本质区别是函数操作的是不是外层传入的原指针变量:
TreeNode* curr:指针值传递,函数会创建一个新的临时指针变量,拷贝原指针的指向地址。后续函数内所有对curr本身的修改(比如curr = root修改指针的指向)都只会作用在这个临时副本上,外层传入的原指针不会发生任何变化。TreeNode* &curr:指针的引用传递,相当于给外层传入的原指针变量起了个别名,函数不会创建新的临时变量,所有对curr本身的修改都会直接作用在外层的原指针上。
注意:如果你只是修改指针指向的内存空间的内容,两种写法都能生效,因为值传递的指针副本和原指针指向的是同一个内存地址。但本题需要修改指针本身的存储值(也就是修改指针的指向),此时只有引用传递能把修改同步到外层。
为什么引用写法才符合题解要求
这道题的核心思路是利用BST中序遍历结果升序的特性,最小差值一定出现在中序遍历相邻的两个节点之间,因此需要一个全局共享的curr指针,持续记录上一个遍历到的节点地址,遍历每一个节点时都和上一个节点做差值计算。
如果用不带引用的指针值传递写法:每一层递归调用拿到的curr都是独立的副本,某一层递归对curr指向的修改不会同步到其他递归层级。比如遍历完左子树后,左子树内部对curr的更新不会传回父节点层,父节点层拿到的curr还是遍历左子树之前的旧值,会直接导致相邻节点的差值计算遗漏、结果错误。
举个简单的测试用例说明:BST结构为根节点2,左子节点1,右子节点3,中序遍历顺序为1→2→3:
- 错误写法调用时,根节点层的
curr初始为nullptr,调用左子树1的递归时传入的是curr的副本 - 左子树1的递归中,将自己持有的
curr副本更新为指向1,递归结束返回根节点层,此时根节点层的curr还是原来的nullptr,无法计算2和1的差值,直接遗漏了正确的最小差值 - 正确写法使用引用传递,所有递归层共享同一个
curr变量,左子树修改curr为1后,根节点层能直接拿到更新后的值,完成2和1的差值计算,后续遍历流程都能正确拿到上一个节点的地址。
内容的提问来源于stack exchange,提问作者Benny
相关产品推荐
相关产品推荐

