二叉树的前序、中序、后序遍历

/**   
 * 二叉树的三种内部遍历:前序、中序、后序
 * 但不管是哪种方式,左子树的遍历在右子树的遍历之前遍历是这有三种遍历方式都
 * 必须遵循的约定
 *  * @author jzj   
* @date 2009-12-23   

 */   

public class BinTreeInOrder extends BinTree {    
    /**   
     * 节点访问者,可根据需要重写visit方法
     */   
    static abstract class Visitor {    
    	void visit(Object ele) {    
    		System.out.print(ele + " ");    
    	}    
    }    
    public void preOrder(Visitor v) {    
        preOrder(v, root);    
    }    
    /**   
     * 树的前序递归遍历pre=prefix(前缀)   
     * @param node 要遍历的节点
  */   
    private void preOrder(Visitor v, Entry node) {    
        //如果传进来的节点不为空,则遍历,注,叶子节点的子节点为null    
        if (node != null) {    
            v.visit(node.elem);//先遍历父节点
            preOrder(v, node.left);//再遍历左节点
            preOrder(v, node.right);//最后遍历右节点
        }    
    }    

    public void inOrder(Visitor v) {    
        inOrder(v, root);    
    }    

    /**   
     * 树的中序递归遍历in=infix(中缀)   
     * @param node 要遍历的节点
     */   
    private void inOrder(Visitor v, Entry node) {    
        //如果传进来的节点不为空,则遍历,注,叶子节点的子节点为null    
        if (node != null) {    
            inOrder(v, node.left);//先遍历左节点
            v.visit(node.elem);//再遍历父节点
            inOrder(v, node.right);//最后遍历右节点
        }    
    }    
    public void postOrder(Visitor v) {    
        postOrder(v, root);    
    }    

    /**   
     * 树的后序递归遍历post=postfix(后缀)   
     * @param node 要遍历的节点
  */   
    private void postOrder(Visitor v, Entry node) {    
        //如果传进来的节点不为空,则遍历,注,叶子节点的子节点为null    
        if (node != null) {    
            postOrder(v, node.left);//先遍历左节点
            postOrder(v, node.right);//再遍历右节点
            v.visit(node.elem);//最后遍历父节点
        }    
    }    
    //测试
    public static void main(String[] args) {    
        //创建二叉树
        int[] nums = new int[] { 1, 2, 3, 4, 0, 0, 5, 0, 6, 0, 0, 0, 0, 7, 8 };    
        BinTreeInOrder treeOrder = new BinTreeInOrder();    
        treeOrder.createBinTree(nums);    
        System.out.print("前序遍历- ");    
        treeOrder.preOrder(new Visitor() {    });    
        System.out.println();    
        System.out.print("中序遍历 - ");    
        treeOrder.inOrder(new Visitor() {   });    
        System.out.println();    
        System.out.print("后序遍历- ");    
        treeOrder.postOrder(new Visitor() {    });    
        /*   
         * output:   
         * 前序遍历- 1 2 4 6 3 5 7 8    
         * 中序遍历 - 4 6 2 1 3 7 5 8    
         * 后序遍历- 6 4 2 7 8 5 3 1    
        */   
    }    
}    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值