今日题目:
102.二叉树的层序遍历
226.反转二叉树
101.对称二叉树
今日总结
层序遍历也是需要背下来的模板。总之记得要使用队列并且有两层循环。对称二叉树这题可以记住怎么处理左右孩子节点。
102.二叉树的层序遍历
要点
- 使用队列!
- 内部需要单独存储当前队列的长度并添加一层循环,因为此时队列的长度会在处理时不断变化,如果只有一层循环的话结果会有错误。
代码:
func levelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
queue := []*TreeNode{root}
res := [][]int{}
for len(queue) > 0 {
curLength := len(queue) //在之后处理节点的过程中queue会改变 所以单独使用一个变量存储
tmpRes := []int{}
for i :=0;i < curLength; i++ {
curNode := queue[0]
tmpRes = append(tmpRes, curNode.Val)
queue = queue[1:]
if curNode.Left != nil {
queue = append(queue, curNode.Left)
}
if curNode.Right != nil {
queue = append(queue, curNode.Right)
}
}
res = append(res, tmpRes)
}
return res
}
226. 反转二叉树
要点:
- 没啥说的
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
root.Left, root.Right =root.Right, root.Left
invertTree(root.Left)
invertTree(root.Right)
return root
}
101.对称二叉树
要点:
- 想到内外侧分开处理就好做了
- 注意这里的终止条件,不要使用leftNode.Val == rightNode.Val
func isSymmetric(root *TreeNode) bool {
if root == nil {
return true
}
return compare(root.Left,root.Right)
}
func compare(leftNode *TreeNode, rightNode *TreeNode) bool {
if leftNode == nil && rightNode != nil {
return false
} else if leftNode != nil && rightNode == nil {
return false
} else if leftNode == nil && rightNode == nil {
return true
} else if leftNode.Val != rightNode.Val {
return false
}
outside := compare(leftNode.Left, rightNode.Right)
inside := compare(leftNode.Right, rightNode.Left)
return outside && inside
}