解题思路:
(1)递归实现:利用中序遍历的思想,在遍历到每一个节点的同时,如果这个节点不为空或者这个节点不为叶子节点,将其看做根节点,交换其左右子树的指针的位置。直到递归返回到根节点为止,形成二叉树的镜像。
(2)循环实现:可以借鉴层次遍历的思想,在某个节点出队列的时候,先交换这个节点的左右子树,在将交换后的左右子节点入队列,如此循环下去。有兴趣的可以自己实现下。
class TreeNode {
int val;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
/**
* 求二叉树的镜像
*/
public class Solution {
/**
* 解题思路:将一颗二叉树每个节点的左子树交换到右子树,右子树交换到左子树
*/
public static void Mirror(TreeNode root) {
if (root == null) {
return;
}
// 叶子节点无需交换,直接返回
if (root.left == null && root.right == null) {
return;
}
// 对左子树进行镜像操作
Mirror(root.left);
// 对右子树进行镜像操作
Mirror(root.right);
// 将左、右子树合并为一个新树
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}