我用composite模式写的一个二叉树的例子

2008-05-24 05:33:35.0     浏览:189     来源:天新网
关键词:

我用composite模式写的一个二叉树的例子

1,Component 是抽象组件

Tree 和Leaf 继承Component


private String name; //树或叶子的名称

addChild(Component leftChild,Component rightChild);

//给一个树上加上一个左孩子,一个右孩子

getName(){return name;}

getTreeInfo(){} //得到树或叶子的详细信息

getLength(); //得到树的高度


2,Tree 二叉树,一个左孩子,一个右孩子


3,Leaf 是叶子节点

4,Test 是测试节点


/** Component.Java **************/

package binarytree;

public abstract class Component {

private String name;

public abstract Component addChild(Component leftChild,Component rightChild);

public String getName(){return name;}

public void getTreeInfo(){}

public abstract int getLength();

}


/** Leaf.java **************/

package binarytree;

public class Leaf extends Component{

private String name;

private Component leaf=null;

public Leaf(String name) {

this.name=name;

}

public Component addChild(Component leftChild,Component rightChild){

return this;

}

public String getName(){

return name;

}

public int getLength() {

return 1;

}

public static void main(String[] args) {

}

}


/** Tree.java **************/

package binarytree;

public class Tree extends Component {

private String name;

private Component leftChild;

private Component rightChild;

public Tree(String name,Component leftChild,Component rightChild) {

this.name=name;

this.leftChild=leftChild;

this.rightChild=rightChild;

}

public Tree(String name) {

this.name=name;

this.leftChild=null;

this.rightChild=null;

}

public Component addChild(Component leftChild,Component rightChild){

this.leftChild=leftChild;

this.rightChild=rightChild;

return this;

}

public String getName(){

return name;

}

public void getTreeInfo()

//得到树或叶子的详细信息

//先打印自己的名字,再遍例左孩子,再遍例右孩子

//如果左孩子或右孩子是树,递归调用

{

System.out.println(" this trees name is "+getName());

if(this.leftChild instanceof Leaf)

{

System.out.println(getName()+"s left child is "+this.leftChild.getName()+",it is a Leaf");

}

if(this.leftChild instanceof Tree){

System.out.println(getName()+"s left child is "+this.leftChild.getName()+",it is a Tree");

this.leftChild.getTreeInfo();

}

if(this.leftChild==null)

{

System.out.println(getName()+"s left child is a null");

}

if(this.rightChild instanceof Leaf)

{

System.out.println(getName()+"s right child is "+this.rightChild.getName()+",it is a Leaf");

}

if(this.rightChild instanceof Tree) {

System.out.println(getName()+"s right child is "+this.rightChild.getName()+",it is a Tree");

this.rightChild.getTreeInfo();

}

if(this.rightChild==null)

{

System.out.println(getName()+"s right child is a null");

}

//System.out.println(getName()+"s 高度 是 "+getLength());

}

public int getLength() {

//比较左孩子或右孩子的高度,谁大,+1 返回

// 空孩子的处理

if(this.leftChild==null) {

if(this.rightChild==null)

return 1;

else

return this.rightChild.getLength()+1;

}

else {

if(this.rightChild==null) {

return this.leftChild.getLength()+1;

}

else {

if((this.leftChild.getLength())>=(this.rightChild.getLength()))

return this.leftChild.getLength()+1;

else

return this.rightChild.getLength()+1;

}

}

}

public static void main(String[] args) {

}

}


/** Test.java 测试类 **************/

package binarytree;

public class Test {


public Test() {

}

public static void main(String[] args) {

Component tree=new Tree("luopeng");

Component leaf_child=new Leaf("luopeng1");

Component right_child=new Leaf("luopeng2");

tree=tree.addChild(leaf_child,right_child);

//tree=tree.addRightChild(right_child);

tree.getTreeInfo();

Component tree1=new Tree("luopeng2");

tree1.addChild(tree,leaf_child);

tree1.getTreeInfo();

Component tree2=new Tree("luopeng3");

tree2.addChild(tree,null);

tree2.getTreeInfo();

Component tree4=new Tree("luopeng4");

tree4.addChild(null,tree);

tree4.getTreeInfo();

System.out.println(tree4.getName()+"的高度是 "+tree4.getLength());

}