求二叉树的镜像,破坏原来的二叉树
(1)如果二叉树为空,返回空
(2)如果二叉树不为空,求左子树和右子树的镜像
(3)交换左子树和右子树
(4)原来的树根直接指向交换后的左子树和右子树
求二叉树的镜像,不能破坏原来的二叉树
实质跟上面一样,只是申请一个树根节点,最后指向交换后的左子树和右子树
实现过程如下所示:
package cn.edu.nwu.tree;
/**
* @author jcm
*
*时间 2016年9月16日
*/
public class GetTreeNodeMirrorRecursion {
public static void main(String[] args) {
TreeNode root = CreateBinaryTree.createTreeNode();
System.out.println("交换前的二叉树");
GetTreeNodeInOrderTraver.inOrderRecursion(root);
System.out.println();
System.out.println("递归实现二叉树中序遍历");
GetTreeNodeInOrderTraver.inOrderRecursion(getTreeNodeMirrorRecursion(root));
System.out.println();
System.out.println("非递归实现二叉树中序遍历");
GetTreeNodeInOrderTraver.inOrder(getTreeNodeCopyMirrorRecursion(root));
}
/**
* @author jcm
* 求二叉树的镜像
* 这个方法可以看出,他已经破坏了原来的二叉树
* (1)如果二叉树为空,返回空
* (2)如果二叉树不为空,求左子树和右子树的镜像
* (3)交换左子树和右子树
* (4)原来的树根直接指向交换后的左子树和右子树
* @param root
* @return
*/
public static TreeNode getTreeNodeMirrorRecursion(TreeNode root){
if(root == null){
return null;
}
TreeNode leftTreeNode = getTreeNodeMirrorRecursion(root.leftChild);
TreeNode rightTreeNode = getTreeNodeMirrorRecursion(root.rightRight);
//交换左子树和右子树
root.leftChild = rightTreeNode;
root.rightRight = leftTreeNode;
return root;
}
/**
* @author jcm
* 求二叉树的镜像
* 这个方法可以看出,如果不能破坏二叉树,则需要定义一个新节点,分别指向二叉树的左子树和右子树
* (1)如果二叉树为空,返回空
* (2)如果二叉树不为空,求左子树和右子树的镜像,
* (3)交换左子树和右子树
* @param root
* @return
*/
public static TreeNode getTreeNodeCopyMirrorRecursion(TreeNode root){
if(root == null){
return null;
}
//定义新节点
TreeNode newTreeNode = new TreeNode(root.data);
TreeNode leftTreeNode = getTreeNodeCopyMirrorRecursion(root.leftChild);
TreeNode rightTreeNode = getTreeNodeCopyMirrorRecursion(root.rightRight);
//交换左子树和右子树,新节点分别指向左子树和右子树
newTreeNode.leftChild = rightTreeNode;
newTreeNode.rightRight = leftTreeNode;
return newTreeNode;
}
}