题目
二刷Golong看解后自解(26年5月12日)
func levelOrder(root *TreeNode) [][]int {
ret := [][]int{}
if root == nil {
return nil
}
q := []*TreeNode{root}
for i := 0; len(q) > 0; i++ {
ret = append(ret, []int{}) //改:ret:=append(ret,[]int{})
p := []*TreeNode{}
for j := 0; j < len(q); j++ {
node := q[j]
ret[i] = append(ret[i], node.Val)
if node.Left != nil {
p = append(p, node.Left)
} // p=append(p,node.left)
if node.Right != nil {
p = append(p, node.Right)
} // p=append(p,node.left)
}
q = p
}
return ret
}
错误
1.开始写成了node->left,首先没大写,其次注意go中自动解引用,正确写法node->Left
2.空判断没写,
3.各种不规范语法
解题思路(BFS+队列思想)
为什么选择两个表q和p
如果只用一个表的话当
这里append的时候还在同一层,len(q)就会增加 导致模拟队列 q 中混进了子节点也就是不同层的节点,pop时就不是层序的顺序
那么选择一个表q来记录当前层的队列,当处理子节点时(也就是下一层所有节点)就用另外一个队列p来记录。 当表q都pop完一层结束后,再q=p交换,下一层变成了当前层以此循环达到层序遍历的目的
我的比喻
这里有点像我的学习节奏,第一次先完成"一天的tinyweb学习(初始化root,完成第一层队列)",然后第二天开始循环,"写第一天学习博客(pop第一层)->完成第二天tinyweb学习(完成第二层队列)",
第三天"写第二天学习博客(pop第二层)->完成第三天tinyweb学习(完成第三层队列)"....以此循环
所以第一次root初始化是完成循环的先置条件。一定不要忘
首刷c语言(看解后自解)(26年3月23日)
难在二维数组的储存和申请,指针这一块我现在还是很不清楚 半看题解做的,