操作给定的二叉树,将其变换为源二叉树的镜像。
第一种
使用循环的思路,将每个结点的左右子树调换一下即可。使用递归收集所有结点。
public void Mirror(TreeNode root) {
if (root == null) {
return;
}
List<TreeNode> list = new ArrayList<>();
traverse(root, list);
for (int i = 0; i < list.size(); i++) {
TreeNode cur = list.get(i);
TreeNode tmp = cur.left;
cur.left = cur.right;
cur.right = tmp;
}
}
private void traverse(TreeNode node,List<TreeNode> list) {
if (node == null) {
return;
}
list.add(node);
traverse(node.left, list);
traverse(node.right, list);
}
第二种
直接使用递归,代码非常简洁。 简直不可思议。
递归这算法有点悖论的意思,就是你首先要设想Mirror这个方法已经有了将一个结点及其子树镜像的能力,然后你利用这个还不存在的实现去实现你的方法。真是神奇。
public void Mirror(TreeNode root) {
if (root == null) {
return;
}
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
Mirror(root.left);
Mirror(root.right);
}