书中方法:这道题目可能拿到手没有思路,我们可以在纸上画出简单的二叉树来找到规律。最后我们发现,镜像的实质是对于二叉树的所有节点,交换其左右子节点。搞清楚获得镜像的方法,这道题实际上就变成了一道二叉树遍历的变形。这里选择前序遍历二叉树。
public void change(TreeNode root){
if(root == null)return;
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
change(root.left);
change(root.right);
}
如果改成循环实现:实际上也就是把递归改成循环前序遍历二叉树。注意null是可以被压入栈(队列、HashMap等)的,栈全部是null元素和栈为空不同。
public void change2(TreeNode root){
if(root == null)return;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode now = stack.pop();
if(now.right != null)stack.push(now.right);
if(now.left != null)stack.push(now.left);
TreeNode temp = now.left;
now.left = now.right;
now.right = temp;
}
}