226. 翻转二叉树
题目
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3]
输出:[2,3,1]
示例 3:
输入:root = []
输出:[]
提示:
- 树中节点数目范围在
[0, 100]
内 -100 <= Node.val <= 100
解题思路
思路
该题有很多种解法,这里就直接用层次遍历的方式解决了。
该题跟102.二叉树的层序遍历是类似的可以采用层次遍历,只不过需要在遍历的过程中,交换每个节点的左右节点即可。
实现
// 用数组实现个简单的队列功能
type Queue struct {
elements []*TreeNode
}
func NewQueue() *Queue {
return &Queue{elements: make([]*TreeNode, 0)}
}
func (q *Queue) Push(node *TreeNode) {
q.elements = append(q.elements, node)
}
func (q *Queue) Pop() *TreeNode {
if q.IsEmpty() {
return nil
}
node := q.elements[0]
q.elements = q.elements[1:]
return node
}
func (q *Queue) Size() int {
return len(q.elements)
}
func (q *Queue) IsEmpty() bool {
if q.Size() == 0 {
return true
}
return false
}
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
q := NewQueue()
q.Push(root)
for !q.IsEmpty() {
qSize := q.Size() // 代表当前这一层的元素, 一定要先取出size, q.Size()会一直变化
for i := 0; i < qSize; i++ {
topNode := q.Pop()
// 交换左右子树
topNode.Left, topNode.Right = topNode.Right, topNode.Left
// 将该节点的左右子树分别塞入队列中
if topNode.Left != nil {
q.Push(topNode.Left)
}
if topNode.Right != nil {
q.Push(topNode.Right)
}
}
}
return root
}