题目描述
翻转一棵二叉树。
方法一:先序dfs
解题思路
- 交换根节点的左子树和右子树
- 递归分别交换左子树的节点和右子树的节点
代码实现
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return root
}
root.Left, root.Right = root.Right, root.Left
invertTree(root.Left)
invertTree(root.Right)
return root
}
方法二:后续dfs
解题思路
- 递归到叶子节点,交换叶子节点的左子树和右子树
- 一层一层返回,交换
代码实现
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return root
}
invertTree(root.Left)
invertTree(root.Right)
root.Left, root.Right = root.Right, root.Left
return root
}
方法三:bfs
解题思路
- 层序遍历二叉树
- 交换该层每个节点的左子树和右子树
- 迭代交换子树的左子树和右子树
代码实现
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return root
}
queue := make([]*TreeNode, 0)
queue = append(queue, root)
for len(queue) > 0 {
node := queue[0]
queue = queue[1:]
node.Left, node.Right = node.Right, node.Left
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
return root
}