posts - 73,  comments - 55,  trackbacks - 0

我用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 left_child = new Leaf("luopeng1");
  Component right_child = new Leaf("luopeng2");
  tree = tree.addChild(left_child, right_child);
  // tree=tree.addRightChild(right_child);
  tree.getTreeInfo();
  Component tree1 = new Tree("luopeng2");
  tree1.addChild(tree, left_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());
 }
}

posted on 2006-07-31 17:33 保尔任 阅读(555) 评论(0)  编辑  收藏 所属分类: Design Patten

只有注册用户登录后才能发表评论。


网站导航:
 

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(4)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜