二叉树的镜像
题目:请完成一个函数,输入一棵二叉树,该函数输出他的镜像。
分析求镜像的步骤:两棵树的根节点相同,但他们的左右两个子节点交换了位置。因此,我们可以先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶节点的左右子节点之后,就得到了树的镜像。
方法:使用递归或非递归方式交换每个节点的左右子树位置。
递归
思路1:如果当前节点为空,返回,否则交换该节点的左右节点,递归的对其左右节点进行交换处理。
public class TreeNode {
int val;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
public static void mirrorTree(TreeNode root){
if(root == null){
return null;
}
//交换该节点下的左右节点
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
//调用递归
mirrorTree(root.left);
mirrorTree(root.right);
}
}
思路2:如果当前节点为 null,返回 null ,否则先分别对该节点的左右孩子进行镜像处理,然后将该节点的左指针指向右孩子,右指针指向左孩子,对该节点进行镜像处理。
public class TreeNode {
int val;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
public static TreeNode mirrorTree1(TreeNode root)
{
if(root == null)
return null;
//对左右孩子镜像处理
TreeNode left = mirrorTree1(root.left);
TreeNode right = mirrorTree1(root.right);
//对当前节点进行镜像处理。
root.left = right;
root.right = left;
return root;
}
}
非递归
思路1:层次遍历,根节点不为 null 将根节点入队,判断队不为空时,节点出队,交换该节点的左右孩子,如果左右孩子不为空,将左右孩子入队。
public static void mirrorTreeWithQueue(TreeNode root)
{
if(root==null)
return;
//如果树为 null 直接返回。否则将根节点入队列。
Queue<TreeNode> queue= new LinkedList<TreeNode>() ;
queue.add(root);
while(!queue.isEmpty())
{
//队列不为空时,节点出队,交换该节点的左右子树。
TreeNode root1=queue.poll();
//交换
Swap(root);
//入队操作,如果右子树不为 null 入队
if(root1.right!=null) {
queue.add(root1.right);
}
//如果左子树不为 null 入队。
if(root1.left!=null) {
queue.add(root1.left);
}
}
}
public static void Swap(TreeNode root)
{
TreeNode temp;
temp=root.right;
root.right=root.left;
root.left=temp;
}
思路2:先序遍历,如果根节点不为 null 将根节点入栈,当栈不为 null 出栈,交换左右节点,如果左右节点不为 null 入栈。
public static void mirrorTreeWithStack(TreeNode root) {
if (root == null)
return;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (!stack.isEmpty()) {
// 当栈不为 null 时出栈,交换左右子树。
TreeNode root1 = stack.pop();
Swap(root);
if (root1.right != null) {
// 右子树不为 null 入栈
stack.push(root1.right);
}
if (root1.left != null) {
// 左子树不为 null 入栈
stack.push(root1.left);
}
}
}
public static void Swap(TreeNode root) {
TreeNode temp;
temp = root.right;
root.right = root.left;
root.left = temp;
}