Java实现排序树以及四种遍历

Java实现排序树以及四种遍历

首先需要定义一棵排序树,废话,重点在添加节点这个函数。

上代码:


/**
 * 一棵二叉排序树
 *
 * @Author TomShiDi
 * @Since 2019/9/2
 * @Version 1.0
 */
public class TomTree {

    /**
     * 根节点
     */
    private Node rootNode = null;

    /**
     * 节点数
     */
    private int nodeNum = 0;

    /**
     * 修改数
     */
    private int modifyNum = 0;

    /**
     * 广度遍历时使用的队列
     */
    LinkedList<Node> queue = null;

    public TomTree() {
        queue = new LinkedList<>();
    }

    /**
     * 添加一个节点 这里会进行节点的创建以及比较和节点的链接
     * 相同的值不会添加
     * @param value 待加入的值
     * @return 返回true 如果添加成功  返回false 如果添加失败
     */
    public boolean add(int value) {
        if (rootNode == null) {
            rootNode = new Node(value);
            return true;
        }
        Node next = compareAndReturn(rootNode, value);
        if (next != null) {
            if (value < next.getValue()) {
                next.setLeft(new Node(value));
                nodeNum++;
                return true;
            } else {
                next.setRight(new Node(value));
                nodeNum++;
                return true;
            }
        }
        return false;
    }


    /**
     * 对数的节点遍历 寻找待插入的下一个节点的父节点
     * @param startNode 开始查询的节点,递归调用
     * @param value 待插入的值
     * @return 返回null 如果没找到父节点或者树中有相同值的节点  返回父节点 如果值“可以”当做其子节点
     */
    private Node compareAndReturn(Node startNode, int value) {
        /**
         * 如果当前节点是叶子节点 直接返回当前节点
         */
        if (startNode.getLeft() == null && startNode.getRight() == null) {
            return startNode;
        }

        /**
         * 新节点在左子树
         */
        if (value < startNode.getValue()) {
            if (startNode.getLeft() != null) {
                return compareAndReturn(startNode.getLeft(), value);
            } else {
                return startNode;
            }
        }
        /**
         * 新节点在右子树
         */
        if (value > startNode.getValue()) {
            if (startNode.getRight() != null) {
                return compareAndReturn(startNode.getRight(), value);
            } else {
                return startNode;
            }
        }

        return null;
    }

    /**
     * 先序遍历
     * @param currNode 当前节点 递归调用
     */
    public void showTreeFirst(Node currNode) {
        System.out.print(currNode.getValue() + " ");
        if (currNode.getLeft() != null) {
            showTreeFirst(currNode.getLeft());
        }

        if (currNode.getRight() != null) {
            showTreeFirst(currNode.getRight());
        }
    }

    /**
     * 中序遍历
     * @param currNode 当前节点 递归调用
     */
    public void showTreeMid(Node currNode) {
        if (currNode.getLeft() != null) {
            showTreeMid(currNode.getLeft());
        }
        System.out.print(currNode.getValue() + " ");
        if (currNode.getRight() != null) {
            showTreeMid(currNode.getRight());
        }
        return;
    }

    /**
     * 后序遍历
     * @param currNode 当前节点 递归调用
     */
    public void showTreeLast(Node currNode) {
        if (currNode.getLeft() != null) {
            showTreeLast(currNode.getLeft());
        }
        if (currNode.getRight() != null) {
            showTreeLast(currNode.getRight());
        }
        System.out.print(currNode.getValue() + " ");
    }

    /**
     * 广度遍历
     * @param currNode 当前节点 递归调用
     */
    public void showTreeLevel(Node currNode) {
        showTreeLevel(currNode, 1);
    }

    private void showTreeLevel(Node currNode, int level) {
        /**
         * 使用全局队列保存广度遍历的值
         */
        queue.offer(currNode);
        //左子树非空
        if (currNode.getLeft() != null) {
            showTreeLevel(currNode.getLeft(), level + 1);
        }
        //右子树非空
        if (currNode.getRight() != null) {
            showTreeLevel(currNode.getRight(), level + 1);
        }
        //在最上层递归中输出遍历值
        if (level == 1) {
            while (!queue.isEmpty()) {
                Node t = queue.poll();
                System.out.print(t.getValue() + " ");
            }
        }
    }

    public Node getRootNode() {
        return rootNode;
    }

    public int getNodeNum() {
        return nodeNum;
    }

    /**
     * 定义节点数据结构
     */
    class Node {
        private Node left;

        private Node right;

        private int value;

        Node(int value) {
            this.value = value;
        }

        int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        Node getLeft() {
            return left;
        }

        void setLeft(Node left) {
            this.left = left;
        }

        Node getRight() {
            return right;
        }

        void setRight(Node right) {
            this.right = right;
        }
    }
}

树的定义完成,我把排序函数也定义在了树的类中,方便调用。

使用一下



public class RunClass {
    public static void main(String []args) throws Exception{
        showTreeFirst();
        System.out.print("\t先序遍历\n");
        showTreeMid();
        System.out.print("\t中序遍历\n");
        showTreeLast();
        System.out.print("\t后序遍历\n");
        showTreeLevel();
        System.out.print("\t广度遍历\n");
    }

    public static void showTreeFirst() {
        TomTree tomTree = new TomTree();
        tomTree.add(2);
        tomTree.add(1);
        tomTree.add(3);
        tomTree.add(4);
        tomTree.add(5);
        tomTree.showTreeFirst(tomTree.getRootNode());
    }

    public static void showTreeMid() {
        TomTree tomTree = new TomTree();
        tomTree.add(2);
        tomTree.add(1);
        tomTree.add(3);
        tomTree.add(4);
        tomTree.add(5);
        tomTree.showTreeMid(tomTree.getRootNode());
    }

    public static void showTreeLast() {
        TomTree tomTree = new TomTree();
        tomTree.add(2);
        tomTree.add(1);
        tomTree.add(3);
        tomTree.add(4);
        tomTree.add(5);
        tomTree.showTreeLast(tomTree.getRootNode());
    }

    public static void showTreeLevel() {
        TomTree tomTree = new TomTree();
        tomTree.add(2);
        tomTree.add(1);
        tomTree.add(3);
        tomTree.add(4);
        tomTree.add(5);
        tomTree.showTreeLevel(tomTree.getRootNode());
    }
}

输入序列是2,1,3,4,5

各种遍历的输出分别为:

2 1 3 4 5 	先序遍历
1 2 3 4 5 	中序遍历
1 5 4 3 2 	后序遍历
2 1 3 4 5 	广度遍历
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页