Day15
- 通过队列实现层序遍历,逐层将节点加入队列,并在同一层内将节点值存入一个数组。
- 每遍历完一层,将该层的节点值数组加入结果数组中。
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]
ret[i] = append(ret[i], node.Val)
if node.Left != nil {
p = append(p, node.Left)
}
if node.Right != nil {
p = append(p, node.Right)
}
}
q = p
}
return ret
}
- 递归地翻转每个节点的左右子树。
- 从根节点开始,交换左右子树,然后递归地对左右子树进行翻转。
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
root.Left, root.Right = invertTree(root.Right), invertTree(root.Left)
return root
}
- 使用队列进行迭代,比较树的左右子树是否对称。
- 每次从队列中取出两个节点,比较它们的值是否相等,并按照对称的顺序加入队列。
func isSymmetric(root *TreeNode) bool {
u, v := root, root
q := []*TreeNode{}
q = append(q, u)
q = append(q, v)
for len(q) > 0 {
u, v = q[0], q[1]
q = q[2:]
if u == nil && v == nil {
continue
}
if u == nil || v == nil {
return false
}
if u.Val != v.Val {
return false
}
q = append(q, u.Left)
q = append(q, v.Right)
q = append(q, u.Right)
q = append(q, v.Left)
}
return true
}