力扣刷题心得
二叉树篇
今天是2022年11月30日,本以为疫情在11月会结束,没想到又继续封控了一个月,10月已经封了半个月,那时候就打算11月的时候,坚持每天力扣,幸不辱命。
这个月也是跟着代码随想录 (programmercarl.com)刷题,巧合的是今天是11月的最后一天,也是完成代码随想录二叉树篇最后一题的一天。
我记得从最开始的二叉树的几种遍历顺序,最开始上手的是二叉树的层序遍历,弄清楚一个模版(双队列层序遍历二叉树)就可以开始“秒题”(大部分的简单、中等题):
func levelOrder(root *TreeNode) [][]int {
// ret := [][]int{}
if root == nil {
return ret
}
q := []*TreeNode{root}
for i := 0; len(q) > 0; i++ {
// ret = append(ret, []int{})
p := []*TreeNode{}
for j := 0; j < len(q); j++ {
node := q[j]
// 此处可添加值操作;
if node.Left != nil {
p = append(p, node.Left)
}
if node.Right != nil {
p = append(p, node.Right)
}
}
q = p
}
return ret
}
然后就可以刷下面这些题了,
之后,前序、中序、后续遍历也有一些题,但这时候主要考虑的递归方向的问题,恰当选择递归顺序。
中序应用最多的还是,二叉搜索树,因为中序遍历是有序的,这也是此章节最后一个难点。
不过此时,我仍对一些问题感觉模糊(靠着感觉能写对一些题,但对为什么的掌握还不到位):
- 递归回溯,回溯表具体的表现位置;
- 递归函数参数如何设置,递归函数返回值如何设置;
最最重要的事情是:坚持!