题目描述:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
示例1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
解题思路:
在求一个二叉树的镜像的时候,不能简单地交换左右子节点的数值,仅仅交换数值无法实现子节点的孩子节点的交换,而是应该交换左右子节点。因此,求一个二叉树的镜像的过程:前序遍历二叉树的每个节点,如果遍历的节点有子节点,那么交换左右子节点,当交换完所有的非叶子节点的左右子节点之后,就可以得到该二叉树的镜像,该过程可以基于递归实现和使用辅助栈实现。
实现代码:
//解法1:基于递归
public TreeNode mirrorTree(TreeNode root) {
if(root == null || (root.left == null && root.right == null))
return root;
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
if(root.left != null)
root.left = mirrorTree(root.left);
if(root.right != null)
root.right = mirrorTree(root.right);
return root;
}
//解法2:辅助栈
public TreeNode mirrorTree1(TreeNode root){
if(root == null || (root.right == null && root.left == null))
return root;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.empty()){
TreeNode cur = stack.pop();
if(cur.left != null)
stack.push(cur.left);
if(cur.right != null)
stack.push(cur.right);
TreeNode temp = cur.left;
cur.left = cur.right;
cur.right = temp;
}
return root;
}