226. 翻转二叉树 (简单)
题目描述
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
题目解析
解法一: DFS递归
思路: 对每一个节点, 翻转它的左右子树(左右指针交换), 并对左右子树下的每一个节点做相同操作即可翻转整棵树.
// Time: O(n), Space: O(n)
// DFS递归
public void invertTreeDFS(TreeNode root) {
if (root == null) {
return;
}
// 翻转左右节点
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
// 对左右子树做相同操作
invertTreeDFS(root.left);
invertTreeDFS(root.right);
}
解法二: BFS队列
使用队列进行BFS, 遍历每一个节点, 把节点的左右指针交换即可.
// BFS队列
public void invertTreeBFS(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode s = queue.poll();
// 交换左右子树
TreeNode tmp = s.left;
s.left = s.right;
s.right = tmp;
// 交换完毕, 放入左右根节点继续操作
if (s.left != null) queue.offer(s.left);
if (s.right != null) queue.offer(s.right);
}
}