美文网首页
手写搜索二叉树

手写搜索二叉树

作者: 明月几何8 | 来源:发表于2019-10-26 18:50 被阅读0次
    每日一新

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

    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();
        }
    }
    

    相关文章

      网友评论

          本文标题:手写搜索二叉树

          本文链接:https://www.haomeiwen.com/subject/vyrmvctx.html