题目描述
// 力扣
// 请完成一个函数,输入一个二叉树,该函数输出它的镜像。
// 牛客
// 操作给定的二叉树,将其变换为源二叉树的镜像。
题解
// 递归一定要按照函数的语义来递归,往往不需要知道递归细节
// 递归到最后总是会需要解决问题的基本单元,在这道题目中,
// 问题的基本单元就是交换一个根结点的左结点(假设是叶结点吧)和右结点
// 力扣
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.7 MB, 在所有 Java 提交中击败了82.58%的用户
class Solution {
// 解题函数:使输入二叉树root镜像翻转
// 遍历按照前序遍历的顺序,先对当前结点使用swap,
// 然后在左子树递归镜像翻转函数mirrorTree,
// 最后在右子树递归镜像翻转函数mirrorTree
public TreeNode mirrorTree(TreeNode root) {
if (root == null)
return null;
swap(root); //
mirrorTree(root.left);
mirrorTree(root.right);
return root;
}
// 交换函数:仅对当前根结点A的左子树与右子树交换一次位置
private TreeNode swap(TreeNode A) {
TreeNode temp = A.left;
A.left = A.right;
A.right = temp;
return A;
}
}
// 牛客
// 运行时间:15ms
// 占用内存:9836k
public class Solution {
public void Mirror(TreeNode root) {
if (root == null)
return;
root = swap(root);
Mirror(root.left);
Mirror(root.right);
}
private TreeNode swap(TreeNode A) {
TreeNode temp = A.left;
A.left = A.right;
A.right = temp;
return A;
}
}