手写搜索二叉树

2019-10-26  本文已影响0人  明月几何8
每日一新

废话不多说,直接上代码。

package datastruct;

/**
 * 排序二叉树(搜索二叉树)
 */
public class Tree<E extends Comparable<E>> {
    //root用来保存根节点的引用
    private Node root;
    //节点的个数
    private int size;

    /**
     * 描述二叉树当中的一个节点。
     */
    private class Node {
        //data用来保存添加的元素,这些元素应该实现Comparable接口,方便比较大小
        E data;
        //left,right用来保存左右子节点的引用
        Node left;
        Node right;

        public Node(E e) {
            this.data = e;
        }

        /**
         * 将新节点添加到当前节点下面
         *
         * @param e 要添加的节点
         * @return 添加成功,返回true
         */
        public boolean addChild(E e) {
            /*
             *新节点的元素值与当前节点的元素值相等,则不用添加
             * 注:
             *  二叉树不允许重复元素
             */
            if (e.compareTo(this.data) == 0) {
                return false;
            } else if (e.compareTo(this.data) < 0) {
                /*
                 * 新节点的元素值比当前节点的元素值小,
                 * 则新节点应该添加到当前节点的左子树上
                 */
                if (this.left == null) {
                    //左子树为空,则新节点作为当前节点的左子树
                    this.left = new Node(e);
                    size++;
                    return true;
                } else {
                    return left.addChild(e);
                }
            } else if (e.compareTo(data) > 0) {
                /*
                 * 新节点的元素值比当前节点的元素值大,
                 * 则新节点应该添加到当前节点的右子树上
                 */
                if (this.right == null) {
                    this.right = new Node(e);
                    size++;
                    return true;
                } else {
                    return right.addChild(e);
                }
            } else {
                return false;
            }

        }

        /**
         * 对当前节点进行中序遍历,并且将当前节点元素的值添加到builder对象里面
         *
         * @param builder
         */
        public void appendTo(StringBuilder builder) {
            //先中序遍历左子树
            if (this.left != null) {
                this.left.appendTo(builder);
            }
            //访问根节点
            builder.append(this.data + ",");
            //中序遍历右子树
            if (this.right != null) {
                this.right.appendTo(builder);
            }
        }

    }

    /**
     * 将元素添加到二叉树合适的位置
     *
     * @param e 被添加的元素
     * @return 添加成功返回true
     */
    public boolean add(E e) {
        Node node = new Node(e);
        if (root == null) {
            //当前二叉树为空,则该节点为根节点
            root = node;
            root.left = null;
            root.right = null;
            //节点个数加1
            size++;
            return true;
        } else {
            //当前二叉树不为空,则将该节点作为根节点的子节点进行添加
            return root.addChild(e);
        }

    }

    /**
     * 将二叉树按照中序遍历的方式输出所有节点的元素值
     *
     * @return
     */
    @Override
    public String toString() {
        if (root == null) {
            return "[]";
        }
        StringBuilder builder = new StringBuilder("[");
        root.appendTo(builder);
        builder.delete(builder.lastIndexOf(","), builder.length());
        return builder.append("]").toString();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读