二叉树遍历


二叉树遍历分为:深度优先遍历和广度优先遍历,在课堂上主要提及到的先序遍历,中序遍历和后序遍历属于深度优先遍历,广度优先遍历的主要实现是层级遍历。

二叉树本身属于图的一种,定义为连通的无环图,刚开始学习《算法4》这本书的时候还一直在翻目录,怎么没有提到重要的二叉树先序遍历,中序遍历和后序遍历呢?后来才拍拍脑门觉得自己太蠢了,写的深度优先和广度优先不就是为图设计的么,二叉树又本身就是图的一种。

二叉树的实现实际上就是一个递归的过程,现将自己的代码贴出来

	public Node  put(Node x,String key,Integer value) {
		if (x == null) return new Node(key, value);
        int cmp = key.compareTo(x.key);
        if      (cmp < 0) x.left  = put(x.left,  key, value);
        else if (cmp > 0) x.right = put(x.right, key, value);
        else              x.value   = value;
        return x;
	}

因此我们可以很方便的由递归来实现先中后序遍历二叉树,它们的实现代码大致相同,区别仅仅是打印的顺序不一。


/** 
     * 先序遍历 
     *  
     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 
     *  
     * @param node 
     *            遍历的节点 
     */  
    public static void preOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        System.out.print(node.data + " ");  
        preOrderTraverse(node.left);  
        preOrderTraverse(node.right);  
    }  


 /** 
     * 中序遍历 
     *  
     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 
     *  
     * @param node 
     *            遍历的节点 
     */  
    public static void inOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        inOrderTraverse(node.left);  
        System.out.print(node.data + " ");  
        inOrderTraverse(node.right);  
    }  

后序就不贴出来了,就只是输出挪到了第三行,三序遍历的递归实现其实也可以看成输出前中后序挪位(笑~)

为什么会这样呢,简单分析一下其中一种:先序遍历,从根节点出发(根据定义,左右节点访问是先左后右),将传入实参的值打印出来(即根节点),然后向左遍历直到左子树的最左端 即3号点,这时候它的左孩子(Left)指针为空,return,即又返回到了3号节点,执行下一步,遍历该节点的右子树的根节点 遍历顺序即123456,符合先序条件。


中序遍历一样的,只不过是先到最左的节点(3),然后执行输出打印,随即中序遍历3的右子树 输出序列为354621 (下图是从0)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值