树——二叉树的遍历

源码在这里下载


一、算法思路

二叉树的遍历使用了递归的思想,根据查看元素的顺序不同,分为前中后序以及层序遍历。其中前中后序遍历又可以通过显示调用栈的方法减少调用帧的使用。层序遍历即将前中后序遍历中的调用栈换成队列。
前序遍历:(1)访问根。(2)递归地前序遍历左子树。(3)递归地前序遍历右子树。
中序遍历:(1)递归地中序遍历左子树。(2)访问根。(3)递归地中序遍历右子树。
后序遍历:(1)递归地后序遍历左子树。(2)递归地后序遍历右子树。(3)访问根。

二、算法实现

二叉树的实现

package com.qianshan.tree;

import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;

/** Node in a binary tree. */
public class BinaryNode<E> {

    private E item;

    private BinaryNode<E> left;

    private BinaryNode<E> right;

    public BinaryNode(E item) {
        this.item = item;
    }

    public BinaryNode(E item, BinaryNode<E> left, BinaryNode<E> right) {
        this.item = item;
        this.left = left;
        this.right = right;
    }

    public E getItem() {
        return item;
    }

    public void setItem(E item) {
        this.item = item;
    }

    public BinaryNode<E> getLeft() {
        return left;
    }

    public void setLeft(BinaryNode<E> left) {
        this.left = left;
    }

    public BinaryNode<E> getRight() {
        return right;
    }

    public void setRight(BinaryNode<E> right) {
        this.right = right;
    }

    public boolean isLeaf(){
        return (left == null) && (right == null);
    }

    /**PreOrder Traversal */
    public String toStringPreOrder(){
        String result = "";
        String node = (String) item;
        result += node;
        if (left != null){
            result += this.getLeft().toStringPreOrder();
        }
        if (right != null){
            result += this.getRight().toStringPreOrder();
        }
        return result;
    }
	/**InOrder Traversal */
    public String toStringInOrder(){
        String result = "";
        String node = (String) item;
        if (left != null) {
            result += left.toStringInOrder();
        }
        result += node;
        if (right != null){
            result += right.toStringInOrder();
        }
        return result;
    }

	/**PostOrder Traversal */
    public String toStringPostOrder(){
        String result = "";
        String node = (String) item;
        if (left != null){
            result += left.toStringPostOrder();
        }
        if (right != null){
            result += right.toStringPostOrder();
        }
        result += node;
        return result;
    }

    /** Traversed pre order by stack */
    public String toStringPreOrderByStack(){
        String result = "";
        Stack<BinaryNode> binaryNodes = new Stack<>();
        binaryNodes.push(this);
        while (!(binaryNodes.isEmpty())){
            BinaryNode node = binaryNodes.pop();
            result += node.getItem();
            if (node.right != null){
                binaryNodes.push(node.right);
            }
            if (node.left != null){
                binaryNodes.push(node.left);
            }
        }
        return result;
    }
	/** Level Order Traversal */ 
    public String toStringLevelOrder(){
        String result = "";
        ArrayBlockingQueue<BinaryNode> binaryNodes = new ArrayBlockingQueue<BinaryNode>(10);
        binaryNodes.add(this);
        while(!(binaryNodes.isEmpty())){
            BinaryNode node = binaryNodes.peek();
            binaryNodes.remove();
            result += node.item;
            if (node.left != null){
                binaryNodes.add(node.left);
            }
            if (node.right != null){
                binaryNodes.add(node.right);
            }
        }
        return result;
    }
}

三、样例图示

二叉树样例
对于图中二叉树,不同遍历次序下访问节点的次序如下表所示。

遍历次序访问节点的次序
前序AGEKLHBFICJD
中序GKELAFBHCJID
后序KLEGFBJCDIHA
层序AGHEBIKLFCDJ
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值