【在线编程】二叉树的镜像
【问题描述】
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
【解题思路 & Java实现】
首先:掌握二叉树的层次遍历,借用一个队列。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.LinkedList;
import java.util.Queue;
/**
* 二叉树的层次遍历
*/
public class LevelTravel {
public static void leveTravelOfBinaryTree(TreeNode root) {
if (root == null) {
System.out.println("Tree is null!");
}
Queue<TreeNode> nodes = new LinkedList<>();
nodes.offer(root);
while (!nodes.isEmpty()) {
TreeNode target = nodes.poll();
System.out.println(target.val);
//向队列中添加 target 的左孩子
if (target.left != null) {
nodes.offer(target.left);
}
//向队列中添加 target 的右孩子
if (target.right != null) {
nodes.offer(target.right);
}
}
}
public static void main(String[] args) {
TreeNode root = new TreeNode(8);
TreeNode node1 = new TreeNode(6);
TreeNode node2 = new TreeNode(10);
TreeNode node3 = new TreeNode(5);
TreeNode node4 = new TreeNode(7);
TreeNode node5 = new TreeNode(9);
TreeNode node6 = new TreeNode(11);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
leveTravelOfBinaryTree(root);
}
}
本题方法一:在层次遍历二叉树的过程中,交换结点的左右子树。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
public void Mirror(TreeNode root) {
if (root == null) {
return;
}
Queue<TreeNode> nodes = new LinkedList<>();
nodes.add(root);
while (!nodes.isEmpty()) {
TreeNode target = nodes.poll();
if (target.left != null || target.right != null) {
TreeNode temp = target.left;
target.left = target.right;
target.right = temp;
}
if (target.left != null) {
nodes.offer(target.left);
}
if (target.right != null) {
nodes.offer(target.right);
}
}
}
}
本题方法二: 递归。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public void Mirror(TreeNode root) {
if(root == null) {
return;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
//递归交换左子树
Mirror(root.left);
//递归交换右子树
Mirror(root.right);
}
}