概念
刷题
- 找树左下角的值
使用高度代替深度,利用递归解题,遍历顺序为后序遍历,左右中,取左右孩子中,高度最大的值,高度相同取左孩子
- 路径总和
- 路径总和 II
这道题没有中间节点的操作步骤,所以前序后序中序都可以。这道题中递归使用path 是 *[]int 类型的,每次回溯都需要将path的值删掉。 copy的作用是result 加入的是path这个切片指针,path在递归变化,导致所有的result中所有的path都会变,所以这里使用copy到一个新的对象。
- 从中序与后序遍历序列构建二叉树
总结
路径总和II 的path可以变成[]int 类型吗?可以,但依然需要对每一次递归的path复制到一个新的对象来append 到result中,因为切片类型的参数,传递的是切片的头和长度,而不是切片的底层数组,当修改底层数组的元素是引用传递,而扩容数组不会影响外面的切片,因为长度不变。
测试:
结果:
AI解释:
在Go语言中,函数参数的传递方式是基于值传递的。这意味着当你将一个变量(比如切片、散列表、结构体等)作为参数传递给函数时,传递给函数的是该变量的一个副本,而不是原始变量的引用。因此,对参数所做的任何修改都不会影响到原始变量。
切片(Slice)
对于切片,虽然切片本身是一个引用类型,但当你将一个切片作为参数传递给函数时,传递的是切片的副本(即切片的头部和长度),而不是切片的底层数组。这意味着如果你在函数中修改切片的长度或容量(例如通过 append),这将影响副本,但不会影响原始切片。然而,如果你修改了切片的底层数组(例如通过切片操作或直接索引修改),这将影响原始切片,因为切片操作的背后是对底层数组的直接引用。
散列表(Map)
对于map,同样遵循值传递的规则。当你将一个map作为参数传递给函数时,实际上传递的是map的一个副本。这意味着你可以在函数内部修改map的内容(例如添加或删除键值对),但这些更改不会反映到原始map上。
结构体(Struct)
结构体也是通过值传递的。这意味着当你将一个结构体实例作为参数传递给函数时,传递的是该结构体的一个副本。对于基本类型字段的修改不会影响原始结构体,但对于指针类型字段的修改则会影响原始结构体,因为指针指向的是同一个内存地址。