二叉树通常采用链式存储结构,每个结点至少要有两条链分别连接左孩子和右孩子。其中,二叉链表采用两条链连接孩子,每个结点有三个域:data存储数据,left,right分别指向左孩子和右孩子。下面是用JAVA写的一个例子,实现了二叉链表结构和遍历方法。
/*
* 二叉树的二叉链表结点
*/
public class BinaryNode<E> {
public E data;
public BinaryNode<E>left,right;
//构造结点,指定元素和左右孩子结点
public BinaryNode(E data,BinaryNode<E>left,BinaryNode<E>right){
this.data=data;
this.left=left;
this.right=right;
}
public BinaryNode(E data){
this(data,null,null);//构造有值的叶子结点
}
public BinaryNode(){
this(null,null,null);//空结点
}
public boolean isLeaf(){
return this.left==null && this.right==null;
}
public String toString(){
return this.data.toString();
}
}
/*
* 二叉树的构造
*/
public class BinaryTree<E> {
protected BinaryNode<E> root;
public BinaryTree(){ //构造空二叉树
root=null;
}
public BinaryTree(BinaryNode<E>root){
this.root=root; //构造指定根节点的二叉树
}
public boolean isEmpty(){
return this.root==null;
}
public BinaryNode<E>getRoot(){
return this.root; //返回二叉树的根节点
}
//前序遍历
public void preOrder(){
System.out.print("前序遍历");
preOrder(root);
}
private void preOrder(BinaryNode<E>p){
if(p!=null){
System.out.print(p.data+" ");
preOrder(p.left);
preOrder(p.right);
}
}
//中序遍历
public void inOrder(){
System.out.println("中序遍历");
inOrder(root);
}
private void inOrder(BinaryNode<E>p){
if(p!=null){
inOrder(p.left);
System.out.print(p.data+" ");
inOrder(p.right);
}
}
//后序遍历
public void lastOrder(){
System.out.print("后序遍历");
lastOrder(root);
}
private void lastOrder(BinaryNode<E>p){
if(p!=null){
lastOrder(p.left);
lastOrder(p.right);
System.out.print(p.data+" ");
}
}
}
/*
* 构造一个二叉树并且用前序遍历和中序遍历,后序遍历。
*/
public class Traverse {
public static void main(String[] args) {
// TODO Auto-generated method stub
BinaryTree<String> bitree=create();
bitree.preOrder();
bitree.inOrder();
bitree.lastOrder();
}
/*
* 构造一个二叉树
* A
* B C
*D E F
* G H
*
*/
public static BinaryTree<String> create(){
BinaryNode<String> child_a,child_b,child_c,child_d,child_f;
child_d=new BinaryNode<String>("D",null,new BinaryNode("G"));
child_b=new BinaryNode<String>("B",child_d,null);
child_f=new BinaryNode<String>("F",new BinaryNode("H"),null);
child_c=new BinaryNode<String>("C",new BinaryNode("E"),child_f);
child_a=new BinaryNode<String>("A",child_b,child_c);
return new BinaryTree<String>(child_a);
}
}