Leetcode 102.二叉树的层序遍历

26 阅读2分钟

题目

image.png

二刷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

如果只用一个表的话当

image.png

这里append的时候还在同一层,len(q)就会增加 导致模拟队列 q 中混进了子节点也就是不同层的节点,pop时就不是层序的顺序

那么选择一个表q来记录当前层的队列,当处理子节点时(也就是下一层所有节点)就用另外一个队列p来记录。 当表q都pop完一层结束后,再q=p交换,下一层变成了当前层以此循环达到层序遍历的目的

我的比喻

这里有点像我的学习节奏,第一次先完成"一天的tinyweb学习(初始化root,完成第一层队列)",然后第二天开始循环,"写第一天学习博客(pop第一层)->完成第二天tinyweb学习(完成第二层队列)",

第三天"写第二天学习博客(pop第二层)->完成第三天tinyweb学习(完成第三层队列)"....以此循环

所以第一次root初始化是完成循环的先置条件。一定不要忘

首刷c语言(看解后自解)(26年3月23日)

image.png

image.png

难在二维数组的储存和申请,指针这一块我现在还是很不清楚 半看题解做的,