一、二叉树的定义:
是n(n≥0)个结点的有限集合。n=0的树称为空二叉树;n>0的二叉树由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成 。
二、二叉树抽象数据类型
数据集合:二叉树的结点集合,每个结点由数据元素和构造数据元素之间关系的指针组成。
操作集合:(1)双亲结点:把当前结点的双亲结点置为当前结点。
(2)左孩子结点:把当前结点的左孩子结点置为当前结点。
(3)左插入结点:若当前结点非空,则创建新结点x作为当前结点的左孩子结点,原当前结点的左孩子结点则成为新结点的左孩子结点。
(4)左删除子树:若当前结点非空,则删除当前结点左子树的全部结点。
(5)遍历二叉树:按某种遍历方法访问二叉树的每个结点,且每个结点只访问一次。
二叉树的存储结构主要有三种:顺序存储结构、链式存储结构和仿真指针存储结构。
三、二叉树遍历的基本方法分为前序遍历、中序遍历和后序遍历这几种方法。
1、先序遍历:先访问本节点,再访问该节点的左孩子和右孩子;
2、中序遍历:先访问左孩子,再访问本节点,最后访问右孩子;
3、后序遍历:先访问左右孩子,最后访问本节点。
4、层次遍历:按照树的每一层(高度)进行遍历。
public class BiTree{
private BiTreeNode root; //根指针
private void preOrder(BiTreeNode t, Visit vs){//前序
if(t != null){
vs.print(t.data);
preOrder(t.getLeft(),vs);
preOrder(t.getRight(),vs);
}
}
private void inOrder(BiTreeNode t, Visit vs){//中序
if(t != null){
inOrder(t.getLeft(),vs);
vs.print(t.data);
inOrder(t.getRight(),vs);
}
}
private void postOrder(BiTreeNode t, Visit vs){//后序
if(t != null){
postOrder(t.getLeft(),vs);
postOrder(t.getRight(),vs);
vs.print(t.data);
}
}
public static void levelOrder(BiTreeNode t, Visit vs) throws Exception{ //层序遍历二叉树t
LinQueue q = new LinQueue();
if(t == null) return;
BiTreeNode curr;
q.append(t);
while(! q.isEmpty()){
curr = (BiTreeNode)q.delete();
vs.print(curr.data);
if(curr.getLeft() != null)
q.append(curr.getLeft());
if(curr.getRight() != null)
q.append(curr.getRight());
}
}
}
四、二叉树的构造函数
public class BiTree{
BiTree(){ //构造函数
root = null;
}
BiTree(Object item, BiTree left, BiTree right){//构造函数
BiTreeNode l, r;
if(left == null) l = null;
else l = left.root;
if(right == null) r = null;
else r = right.root;
root = new BiTreeNode(item, l, r);
}
public void preOrder(Visit vs){ //前序遍历
reOrder(root, vs);
}
public void inOrder(Visit vs){ //中序遍历
inOrder(root, vs);
}
public void postOrder(Visit vs){ //后序遍历
postOrder(root,vs);
}
}
五、二叉树游标类
public class BiTreeInterator{
BiTreeNode root; //根指针
BiTreeNode current; //当前结点
int iteComplete; //到达尾部标记
BiTreeInterator(){ //构造函数
}
BiTreeInterator(BiTreeNode tree){ //构造函数
root = tree;
current = tree;
iteComplete = 1;
}
public void reset(){ //重置
}
public void next(){ //下一个结点
}
public boolean endOfBiTree(){ //结束否
return iteComplete == 1;
}
public Object getData(){ //取数据元素
if(current == null){
return null;
}else{
return current.data;
}
}