Day16 - 二叉树 Part04

56 阅读3分钟

概念

刷题

  1. 找树左下角的值

leetcode.cn/problems/fi…

使用高度代替深度,利用递归解题,遍历顺序为后序遍历,左右中,取左右孩子中,高度最大的值,高度相同取左孩子

image.png

  1. 路径总和

leetcode.cn/problems/pa…

image.png

  1. 路径总和 II

leetcode.cn/problems/pa…

image.png

这道题没有中间节点的操作步骤,所以前序后序中序都可以。这道题中递归使用path 是 *[]int 类型的,每次回溯都需要将path的值删掉。 copy的作用是result 加入的是path这个切片指针,path在递归变化,导致所有的result中所有的path都会变,所以这里使用copy到一个新的对象。

  1. 从中序与后序遍历序列构建二叉树

leetcode.cn/problems/co…

image.png

总结

路径总和II 的path可以变成[]int 类型吗?可以,但依然需要对每一次递归的path复制到一个新的对象来append 到result中,因为切片类型的参数,传递的是切片的头和长度,而不是切片的底层数组,当修改底层数组的元素是引用传递,而扩容数组不会影响外面的切片,因为长度不变。

测试:

image.png

结果:

image.png

AI解释:

在Go语言中,函数参数的传递方式是基于值传递的。这意味着当你将一个变量(比如切片、散列表、结构体等)作为参数传递给函数时,传递给函数的是该变量的一个副本,而不是原始变量的引用。因此,对参数所做的任何修改都不会影响到原始变量。

切片(Slice)

对于切片,虽然切片本身是一个引用类型,但当你将一个切片作为参数传递给函数时,传递的是切片的副本(即切片的头部和长度),而不是切片的底层数组。这意味着如果你在函数中修改切片的长度或容量(例如通过 append),这将影响副本,但不会影响原始切片。然而,如果你修改了切片的底层数组(例如通过切片操作或直接索引修改),这将影响原始切片,因为切片操作的背后是对底层数组的直接引用。

散列表(Map)

对于map,同样遵循值传递的规则。当你将一个map作为参数传递给函数时,实际上传递的是map的一个副本。这意味着你可以在函数内部修改map的内容(例如添加或删除键值对),但这些更改不会反映到原始map上。

结构体(Struct)

结构体也是通过值传递的。这意味着当你将一个结构体实例作为参数传递给函数时,传递的是该结构体的一个副本。对于基本类型字段的修改不会影响原始结构体,但对于指针类型字段的修改则会影响原始结构体,因为指针指向的是同一个内存地址。

image.png