二叉查找树,Java实现

实现二叉查找树:


import java.util.ArrayList;

/**
 * 二叉查找树
 * 这里使用范型实现,增加其可重用性
 * @param <E>
 */
public class BST<E extends Comparable<E>> {

    //树根
    public TreeNode<E> root;
    //定义大小
    public int size;
    //通过一个数组,构造二叉查找树
    public BST(E[] objects){
        for (int i = 0; i < objects.length; i++){
            insert(objects[i]);
        }
    }

    /**
     * 插入节点方法,用于构建二叉查找树
     * @param object
     * @return
     */
    public boolean insert(E object){
        //根节点为空的时候,把节点插入根节点
        if (root == null){
            root = new TreeNode<>(object);
        }else{
            //根节点不为空,先通过比较大小找到父亲的位置
            TreeNode<E> parent = null;
            TreeNode<E> current = root;
            while(current != null){
                if (object.compareTo(current.element) < 0){
                    parent = current;
                    current = current.leftChild;
                }else if(object.compareTo(current.element) > 0){
                    parent = current;
                    current = current.rightChild;
                }else {
                    return false;
                }
            }
            //找到父亲位置后,判断与父亲的大小关系,插入左子节点或者右子节点
            if (object.compareTo(parent.element) < 0){
                parent.leftChild = new TreeNode<E>(object);
            }else{
                parent.rightChild = new TreeNode<>(object);
            }
        }
        //大小+1,返回答案
        size++;
        return true;
    }

    /**
     * 返回某元素的路径
     * @param object
     * @return
     */
    public ArrayList<TreeNode> path(E object){
        ArrayList<TreeNode> list = new ArrayList<>();
        TreeNode<E> current = root;
        while (current != null){
            list.add(current);
            if (object.compareTo(current.element) < 0){
                current = current.leftChild;
            }else if(object.compareTo(current.element) > 0){
                current = current.rightChild;
            }else{
                break;
            }
        }
        return list;
    }

    /**
     * 删除某元素
     * 首先查找到该元素的位置,分类讨论如何拼接
     * 这里是通过判断左子树是否存在
     * 若存在,找到其左子树中没有右子树的节点
     * 然后替换要删除的节点位置,接着拼接子树
     * @param object
     * @return
     */
    public boolean delete(E object){
        TreeNode<E> parent = null;
        TreeNode<E> current = root;
        //首先要找到该元素是否存在树中
        while (current != null){
            if (object.compareTo(current.element) < 0){
                parent = current;
                current = current.leftChild;
            }else if(object.compareTo(current.element) > 0){
                parent = current;
                current = current.rightChild;
            }else {
                break;
            }
        }
        //如果不在树中,返回false
        if (current == null){
            return false;
        }
        //存在
        //分类讨论,
        //当该元素的左子树为空(这里找有子树也可以,下面跟着换就可以了)
        if (current.leftChild == null){
            //如果为根节点,其右子树变为根节点
            if (parent == null){
                root = current.rightChild;
            }else{
                //如果不是根节点,判断该元素是其父亲的左孩子还是右孩子,直接把其右孩子替代它原来的位置.
                if (object.compareTo(parent.element) < 0){
                    parent.leftChild = current.rightChild;
                }else{
                    parent.rightChild = current.rightChild;
                }
            }
        }else{
            //当前元素的左子树不为空
            //找到一个当前节点的孩子节点中的右子树为空的节点,进行拼接
            TreeNode<E> parentOfRightMost = current;
            TreeNode<E> rightMost = current.leftChild;
            //如果右孩子不为空,继续找
            while (rightMost.rightChild != null){
                parentOfRightMost = rightMost;
                rightMost = rightMost.rightChild;
            }
            //换位置
            current.element = rightMost.element;
            //把找到的节点的左子树替换它的位置
            if (parentOfRightMost.rightChild == rightMost){
                parentOfRightMost.rightChild = rightMost.leftChild;
            }else{
                parentOfRightMost.leftChild = rightMost.leftChild;
            }
        }
        size--;
        return true;

    }

    /**
     * 判断该元素是否在二叉查找树内
     * @param object
     * @return
     */
    public boolean search(E object){
        TreeNode<E> current = root;
        while (current != null){
            if (object.compareTo(current.element) < 0){
                current = current.leftChild;
            }else if(object.compareTo(current.element) > 0){
                current = current.rightChild;
            }else{
                return true;
            }
        }
        return false;
    }

    /**
     * 先序遍历
     * @param node
     */
    public void preOrder(TreeNode<E> node){
        if (node == null){
            return;
        }
        visit(node);
        preOrder(node.leftChild);
        preOrder(node.rightChild);

    }

    /**
     * 后序遍历
     * @param node
     */
    public void postOrder(TreeNode<E> node){
        if (node == null){
            return;
        }
        postOrder(node.leftChild);
        postOrder(node.rightChild);
        visit(node);

    }

    /**
     * 中序遍历
     * @param node
     */
    public void inOrder(TreeNode<E> node){
        if (node == null){
            return;
        }

        inOrder(node.leftChild);
        visit(node);
        inOrder(node.rightChild);

    }

    /**
     * 定义遍历方法
     * @param object
     */
    public void visit(TreeNode<E> object){
        System.out.print(object.element + " ");
    }




    public BST(){

    }

    //返回查尔搜索树中,元素个数
    public int getSize() {
        return size;
    }
    
    //定义节点信息
    class TreeNode<E extends Comparable<E>> {
        public E element;
        public TreeNode<E> leftChild;
        public TreeNode<E> rightChild;
        public TreeNode(E object){
            element = object;
        }
    }
    //测试代码
    public static void main(String args[]){
        //定义测试数据
        Integer[] list = {-23, -34, 1, 23, 0, 12, 2, -10, 53};
        //建立二叉排序树
        BST<Integer> bst = new BST<>(list);
        //先序遍历
        bst.inOrder(bst.root);
        System.out.println();
        //测试删除元素
        for (int i = 0; i < list.length; i++){
            bst.delete(list[i]);
            bst.inOrder(bst.root);
            System.out.println();
        }
    }

}

猜你喜欢

转载自blog.csdn.net/aa792978017/article/details/89078726
今日推荐