题目描述:
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
思路:
仔细观察原二叉树与镜像二叉树,可以发现镜像二叉树实际上就是把每个节点的左右孩子结点进行了交换,比如在遍历到8这个节点时候,首先交换其左右孩子6和10,其对应的子树也应该进行交换。所以我们可以采用前序遍历的方法进行操作,每当遇到一个结点的时候,首先判断其是否有左右孩子(有其中之一即可),如果有的话,就交换其左右孩子,然后继续遍历其左右子树,只要不为空就继续交换其左右孩子节点(在交换具有孩子结点的结点的时候,其孩子结点也一并被交换了)。
代码实现:
递归方式:
public class Solution {
public void Mirror(TreeNode root) {
if(root == null|| root.left==null&&root.right==null) return;
TreeNode tempNode = root.left;
root.left = root.right;
root.right = tempNode;
if(root.left!=null)
Mirror(root.left);
if(root.right!=null)
Mirror(root.right);
}
}
非递归方式:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Stack;
public class Solution {
public void Mirror(TreeNode root) {
if (root == null || (root.left == null && root.right == null))
return;
Stack<TreeNode> s = new Stack<TreeNode>();
s.push(root);
while (!s.isEmpty()) {
TreeNode node = s.pop();
//交换左右孩子结点
TreeNode nodeTemp = node.left;
node.left = node.right;
node.right = nodeTemp;
//遍历左子树
if (node.left != null)
s.push(node.left);
//遍历右子树
if (node.right != null)
s.push(node.right);
}
}
}