You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 错误写法调用时,根节点层的curr初始为nullptr,调用左子树1的递归时传入的是curr的副本
  2. 左子树1的递归中,将自己持有的curr副本更新为指向1,递归结束返回根节点层,此时根节点层的curr还是原来的nullptr,无法计算2和1的差值,直接遗漏了正确的最小差值
  3. 正确写法使用引用传递,所有递归层共享同一个curr变量,左子树修改curr为1后,根节点层能直接拿到更新后的值,完成2和1的差值计算,后续遍历流程都能正确拿到上一个节点的地址。

内容的提问来源于stack exchange,提问作者Benny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:36:03