题目描述
翻转一棵二叉树。
样例
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
算法1
(递归) $O(n)$
- 遍历二叉树,依次交换每个节点的左右子节点
- 需要注意:需要先保存一边的节点,否则在把另一边的节点拼过来之后这个节点会丢失
Java代码
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root == null) return null;
TreeNode tmp = root.left;
root.left = mirrorTree(root.right);
root.right = mirrorTree(tmp);
return root;
}
}
算法2
(栈/队列) $O(n)$
- 和递归一样的思路,用栈和队列来BFS,遍历到的节点交换其左右节点,并把这个节点的左右孩子都加入栈/队列中
- 在这里,先把孩子节点加入栈/队列中和先交换左右孩子的效果是一样的
Java 代码
栈
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root == null) return null;
Stack<TreeNode> stk = new Stack<>();
stk.push(root);
while(!stk.isEmpty()){
TreeNode node = stk.pop();
if(node.left != null) stk.push(node.left);
if(node.right != null) stk.push(node.right);
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
}
return root;
}
}
队列
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root == null) return null;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
}
return root;
}
}