题目地址:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/comments/
代码:
```
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func getMinimumDifference(root *TreeNode) int {
if root == nil {
return 0
}
var pre *TreeNode
minValue := int(^uint(0) >> 1)
getMin(root,pre,&minValue)
return minValue
}
func getMin(root,pre *TreeNode,minValue *int){
if root == nil {
return
}
getMin(root.Left,pre,minValue)
if pre != nil {
if *minValue > root.Val - pre.Val {
*minValue = root.Val - pre.Val
}
}
pre = root
getMin(root.Right,pre,minValue)
}
func main() {
a1 := &TreeNode{5,nil,nil}
a2 := &TreeNode{4,nil,nil}
a3 := &TreeNode{7,nil,nil}
a1.Left = a2
a1.Right = a3
fmt.Println(getMinimumDifference(a1))
}
```
入口getMinimumDifference,当输入的树 位 547本应该输出1 ,但是输出2
如果我把pre和minValue 设置为全局的变量,他就输出对了,不知道是怎么回事?
调试的时候,当递归到左下角返还的时候 ,莫名给pre赋值了
抱歉,我前面说的有点问题,确实是指针传值,重点在![image.png](https://static.studygolang.com/190822/d7cdf578665d61d2ccdac7e0e0e6affe.png)
这个指针赋值上,当你将4这个节点赋值给pre的时候,pre的指针已经不是前面的指针了,这时候的pre其实已经是和root是同一个指针了,就不再是前面你所认为的那个指针了,指针操作需谨慎,你好好体会(前面那个回答习惯性java思维了,见谅,见谅)
#4
更多评论
你这个明显有问题,参数 *TreeNode只是传值,你第一次左侧递归到pre = root,将pre赋值为4的时候,由于是传值,递归回溯的时候上层pre还是空值,就是当root回溯到根节点时![image.png](https://static.studygolang.com/190822/b49a850cd913b6381e270efbb8e7842b.png)
第一步这里根本没有改变pre的值,所以第二步这里的判断pre应该是空,不会进入if语句块进行5-4的操作,整个流程中应该只有一次进入这个语句块7-5(不信的话你可以debug在这打个断点,看看有几次进入),所以结果是2
#1