public class Tree{
Object cargo;
Tree left,right;
public Tree(Object cargo,Tree left,Tree right){
this.cargo=cargo;
this.left=left;
this.right=right;
}
public static void main(String args[]){
Tree left=new Tree(new Integer(2),null,null);
Tree right=new Tree(new Integer(3),null,null);
Tree tree=new Tree(new Integer(1),left,right);
print(tree);
System.out.println();
printPostorder(tree);
System.out.println();
printInorder(tree);
System.out.println();
System.out.println("---------------------------------");
//tree.print();
}
public static void print(Tree tree){ //前缀
if(tree==null) return;
System.out.print(tree.cargo+" ");
print(tree.left);
print(tree.right);
}
public static void printPostorder(Tree tree){ //后缀
if(tree==null) return;
printPostorder(tree.left);
printPostorder(tree.right);
System.out.print(tree.cargo+" ");
}
public static void printInorder(Tree tree){ //中缀
if(tree==null) return;
printInorder(tree.left);
System.out.print(tree.cargo+" ");
printInorder(tree.right);
}
}
/*
java语言中写元类有两种方式:接口类,抽象类
*/
上面这个学着写的还可以,下面这个类就比较乱了
import java.util.*;
public class Token implements Visitable{
String str;
public Token(){
this.str=null;
}
public Token(String str){
this.str=str;
}
public void vist(){
System.out.print(this.str+" ");
}
//此出无法体现接口前public作用
public static void main(String args[]){
String expr="1 2 3 * +";
StringTokenizer st=new StringTokenizer(expr," +-*/",true);
//true:把第二个参数指定的分界符也作为记号输出。
String token=st.nextToken();
//System.out.println(token);
Tree tree=new Tree(new Token(token),null,null);
visitPreorder(tree);
System.out.println();
System.out.println("-------------------------------");
/*
把String类expr变量的第一个记号改换成Token对象,再把
这个Token对象放到一个树的节点中。如果此后对树的
遍历过程中需要“看见”节点的货物时,就可以把Token类型
的对象转换成Visitable对象.需要注意的是,一旦从树中取出
Visitable类型对象后,还必须用转型的方法将之转换成Token
类型,但可以在Token对象身上直接调用vist方法.
*/
Tree tr=new Tree(new Integer(10),null,null);
Tree.print(tr);
}
public static void visitPreorder(Tree tree){
if(tree==null) return;
//System.out.print(tree.cargo+" ");
Token token=new Token();
token=(Token)tree.cargo;
token.vist();
visitPreorder(tree.left);
visitPreorder(tree.right);
}
}