本文为博主原创文章,转载请附带博客地址:https://www.cnblogs.com/xbjhs/p/12108230.html

出来混总是要还的,当初上大学不好好听老师讲,现在工作了,还得买老师出的书再看一遍(手动笑哭)。还在上学的好好学吧。

java系的童鞋给你们推荐一本书:王红梅老师的《数据结构--从概念到java实现》,相对比c++的那版,这个可能更适合java主语言的你

--------------------------------------------------------------------------------------------------------------------------------------------------

1、看此文章之前,需要先掌握队列、二叉树的顺序存储结构。(下次更新用非递归实现遍历)

2.树的截图,代码debug截图在下面,帮助更好理解。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * @description:
 * @author:
 * @create: 2019-12-27 14:34
 **/
public class BinaryTreeImpl {


    /**
     * 前序遍历:根、左,右
     */
    public static void preOrder(BiNode node) {
        if (null == node) {
            return;
        }
        //访问当前根节点的数据域
        System.out.print(node.getData());
        //前序递归遍历node左子树
        preOrder(node.getlChild());
        //前序递归遍历node右子树
        preOrder(node.getrChild());
    }

    /**
     * 中:左 根 右
     */
    public static void inOrder(BiNode node) {
        if (null == node) {
            return;
        }
        //中序递归遍历node左子树
        inOrder(node.getlChild());
        //访问当前根节点的数据域
        System.out.print(node.getData());
        //中序递归遍历node右子树
        inOrder(node.getrChild());

    }

    /**
     * 后:  左右根
     */
    public static void postOrder(BiNode node) {
        if (null == node) {
            return;
        }
        //后序递归遍历node左子树
        postOrder(node.getlChild());
        //后序递归遍历node右子树
        postOrder(node.getrChild());
        //访问当前根节点的数据域
        System.out.print(node.getData());
    }

    /**
     * 层 逐层遍历,每层从左到右
     * 先被访问结点的孩子 先与 后被访问结点的孩子 "先先"特性用队列
     */
    public static void levelOrder(BiNode root) {
        ConcurrentLinkedQueue<BiNode> queue = new ConcurrentLinkedQueue<>();
        if (null == root) {
            return;
        }
        queue.add(root);
        while (!queue.isEmpty()) {
            BiNode node = queue.poll();
            System.out.print(node.getData());
            if (null != node.getlChild()) {
                queue.add(node.getlChild());
            }
            if (null != node.getrChild()) {
                queue.add(node.getrChild());
            }
        }
    }


    public static BiNode createTree(Object[] objects) {
        //存储所有节点
        List<BiNode> datas = new ArrayList<>();
        for (Object obj : objects) {
            datas.add(new BiNode(obj));
        }
        int location = objects.length / 2;
        for (int i = 0; i < location; i++) {
            datas.get(i).setlChild(datas.get(2 * i + 1));
            //避免偶数的时候,下标越界
            if (2 * i + 2 < objects.length) {
                datas.get(i).setrChild(datas.get(2 * i + 2));
            }
        }
        //将一个作为根节点
        BiNode root = datas.get(0);
        return root;
    }

    public static void main(String[] args) {
        //二叉树顺序存储数据,二叉树见下图
        String[] seqTree = {"A", "B", "C", "D", "", "E", "F", "", "G"};
        BiNode root = createTree(seqTree);
        System.out.print("前序遍历结果:");
        preOrder(root);
        System.out.println();
        System.out.print("中序遍历结果:");
        inOrder(root);
        System.out.println();
        System.out.print("后序遍历结果:");
        postOrder(root);
        System.out.println();
        System.out.print("层序遍历结果:");
        levelOrder(root);
    }
}
12-30 04:10