数据结构学习笔记-二叉树的遍历(JAVA)


二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
两种遍历:
递归遍历和层次遍历.
前序:根左右
中序:左根右
后序:左右根
public class Tree
{
    public Tree mLeft;
    public Tree mRight;
    private Data mData;
    public List<Tree> treeList = new ArrayList<Tree>();
    public static final int MAX = 40;
    // 层次遍历时保存各个节点
    Tree[] elements = new Tree[MAX];
    // 层次遍历时队首
    int front;
    // 层次遍历时队尾
    int rear;
    public Tree(Tree left, Tree right, Data data)
    {
        this.mLeft = left;
        this.mRight = right;
        this.mData = data;
    }
    public Tree(Tree left, Tree right, String data)
    {
        this.mLeft = left;
        this.mRight = right;
        this.mData = new Data(data);
    }
    // 前序遍历,根左右
    public void preOrder(Tree parent)
    {
        if (parent == null)
            return;
        System.out.print(parent.mData.desc + " ");
        preOrder(parent.mLeft);
        preOrder(parent.mRight);
    }
    // 中序遍历,左根右
    public void inOrder(Tree parent)
    {
        if (parent == null)
            return;
        inOrder(parent.mLeft);
        System.out.print(parent.mData.desc + " ");
        inOrder(parent.mRight);
    }
    // 后序遍历,左右根
    public void postOrder(Tree parent)
    {
        if (parent == null)
            return;
        postOrder(parent.mLeft);
        postOrder(parent.mRight);
        System.out.print(parent.mData.desc + " ");
    }
    // 遍历treeList并生成下次要遍历的
    public void layerOrder()
    {
        if (treeList.isEmpty())
            return;
        List<Tree> buff = new ArrayList<Tree>();
        for (Tree t : treeList)
        {
            if (t != null)
            {
                System.out.print(t.mData.desc + " ");
                buff.add(t.mLeft);
                buff.add(t.mRight);
            }
        }
        treeList.clear();
        if (!buff.isEmpty())
        {
            treeList.addAll(buff);
            layerOrder();
        }
    }
    // 另外一种利用数组 层次遍历的实现
    public void layerOrder1(Tree parent)
    {
        elements[0] = parent;
        front = 0;
        rear = 1;
        while (front < rear)
        {
            if (elements[front].mData != null)
            {
                System.out.print(elements[front].mData.desc + " ");
                if (elements[front].mLeft != null)
                {
                    elements[rear++] = elements[front].mLeft;
                }
                if (elements[front].mRight != null)
                {
                    elements[rear++] = elements[front].mRight;
                }
                front++;
            }
        }
    }
    public static class Data
    {
        public String desc;
        public Data(String s)
        {
            this.desc = s;
        }
        @Override
        public String toString()
        {
            return desc;
        }
    }
}


public class TreeMain
{
    public static void main(String[] args)
    {
        Tree d = new Tree(null, null, "D");
        Tree e = new Tree(null, null, "E");
        Tree f = new Tree(null, null, "F");
        Tree g = new Tree(null, null, "G");
        Tree b = new Tree(d, e, "B");
        Tree c = new Tree(f, g, "C");
        Tree a = new Tree(b, c, "A");
        a.preOrder(a);
        System.out.println("");
        a.inOrder(a);
        System.out.println("");
        a.postOrder(a);
        System.out.println("");
        a.treeList.add(a);
        a.layerOrder();
    }
}

猜你喜欢

转载自f059074251.iteye.com/blog/2199864