思路:
方法一:递归
方法二:辅助栈
代码:
方法一:
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root==null){
return null;
}
TreeNode left=mirrorTree(root.left);
TreeNode right=mirrorTree(root.right);
root.left=right;
root.right=left;
return root;
}
}
方法二:
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root==null) return null;
Stack<TreeNode> stack=new Stack<>();
stack.add(root);
while(!stack.isEmpty()){
TreeNode node=stack.pop();
if(node.left!=null){
stack.add(node.left);
}
if(node.right!=null){
stack.add(node.right);
}
TreeNode temp=node.left;
node.left=node.right;
node.right=temp;
}
return root;
}
}
分解:
1)方法一:只想第一层:left=root.left,但是由于递归,就变成了left=mirrorTree(root.left)
左右都要递归,再将求出的节点交换,最后返回root,每一层都是返回排好序的root
2)方法二:辅助栈不需要递归,将每次出栈的node的lef和right交换,前提是要判断node的left和right不为空
复杂度分析:
方法一:
时间复杂度:O(N) 每一个都要遍历,都要交换
空间复杂度:O(N) 最差的情况下是二叉树变成了链表,栈的深度为N
方法二:
时间复杂度:O(N)同上
空间复杂度:O(N)每一个都要压入栈中,有N个