package 二叉树;
/*
* 二叉树的构建
* Cloneable 创建一个相同的对象,当克隆出来的对象与原对象拥有不同的地址
*/
public class TreeNode implements Cloneable{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {this.val=x;}
@Override
public boolean equals(Object other) {
if(this == other) //先检查是否其自反性,后比较other是否为空。这样效率高
return true;
if(other == null)
return false;
if( !(other instanceof TreeNode))
return false;
final TreeNode treeNode = (TreeNode)other;
if(this.val!=treeNode.val)
return false;
return true;
}
@Override
protected Object clone() {
Object treeNode=null;
try {
treeNode=super.clone();
} catch (Exception e) {
System.out.println("Erro:"+e);
}
return treeNode;
}
}
package 二叉树;
/*
* 二叉树的反转
* 前序 :根左右
* 中序 :左根右
*/
public class InverTree {
/*
* 反转二叉树的方法
*/
public TreeNode invert(TreeNode root) {
if(root!=null)
{
TreeNode tmp=null;
tmp=root.right;
root.right=root.left;
root.left=tmp;
invert(root.right);
invert(root.left);
return root;
}
return null;
}
/*
* 中序遍历二叉树
*/
public void printData(TreeNode root) {
System.out.print(root.val+"->");
}
public void Preout(TreeNode root)
{ printData(root);
if(root.left!=null)
{
Preout(root.left);
}
if(root.right!=null)
{
Preout(root.right);
}
}
public void Midout(TreeNode root)
{
if(root.left!=null)
{
Midout(root.left);
}
printData(root);
if(root.right!=null)
{
Midout(root.right);
}
}
public static void main(String[] args) throws CloneNotSupportedException {
TreeNode root=new TreeNode(0);
root.left=new TreeNode(1);
root.right=new TreeNode(2);
root.left.left=new TreeNode(3);
root.left.right=new TreeNode(4);
TreeNode temproot=(TreeNode) root.clone();
InverTree inverTree=new InverTree();
System.out.println("反转前的二叉树:");
System.out.println("中序:");
inverTree.Midout(root);
System.out.println("\n前序:");
inverTree.Preout(root);
inverTree.invert(root);
System.out.print("\n反转后的二叉树:\n");
System.out.println("中序:");
inverTree.Midout(root);
System.out.println("\n前序:");
// inverTree.Preout(temproot); //此处的值与 inverTree.Preout(root);不同,Why?不是已经克隆了吗
inverTree.Preout(root);
}
}
输出结果:
反转前的二叉树:
中序:
3->1->4->0->2->
前序:
0->1->3->4->2->
反转后的二叉树:
中序:
2->0->4->1->3->
前序:
0->1->4->3->2-> //正确的克隆结果应该是0->1->3->4->2->
0->2->1->4->3->
是不是我重写的克隆方法有错?