二叉搜索树的Java实现

来源:互联网 发布:新版php卡盟排行榜源码 编辑:程序博客网 时间:2024/05/24 06:50

刚刚自己实现了一下二叉搜索树,记录一下感想
1、首先二叉搜索树是需要有父节点的。这个在删除节点的时候会用到。
2、然后创建树可以借鉴Java中的集合类,树->抽象 二叉树->二叉搜索树的结构。显得专业一点。

见代码:

/** * 所有值是可以比较的树的接口 * @param <T> */public interface Tree<T extends Comparable<T>> {    void addValue(T val) throws BinarySearchTree.HasTheValueAlreadyException; // 增加值    void removeValue(T val) throws BinarySearchTree.WithoutValueException; //删除值    boolean findValue(T val); //查找值    boolean isEmpty(); //查看树是否为空    void print(); //打印}
public abstract class AbstractTree implements Tree{    protected Node root;    @Override    public boolean isEmpty() {        return root == null;    }}
public class BinarySearchTree extends AbstractTree {    @Override    public void addValue(Comparable val) throws HasTheValueAlreadyException {        Node node = new Node(val);        addNode(root, node);    }    private void addNode(Node parent, Node new_node) throws HasTheValueAlreadyException {        if(parent == null) {            root = new_node;            return;        }        Node left = parent.left;        Node right = parent.right;        int compare_res = parent.value.compareTo(new_node.value);        if(compare_res == 0) {            throw new HasTheValueAlreadyException("the value " +                    new_node.value + " " + "has existed");        }        if(compare_res == -1) {            if(right == null) {                parent.right = new_node;                new_node.parent = parent;            } else {                addNode(parent.right, new_node);            }            return;        }        if(compare_res == 1) {            if(left == null) {                parent.left = new_node;                new_node.parent = parent;            } else {                addNode(parent.left, new_node);            }            return;        }    }    @Override    public void removeValue(Comparable val) throws WithoutValueException {        Node node = findNode(root, val);        if(node == null) {            throw new WithoutValueException("without the value" + " " + val);        }        Node realNode = node;        while (realNode.left != null) {            realNode = realNode.left;        }        node.value = realNode.value;        if(realNode == node) {            Node parent = realNode.parent;            Node realNodeRight = realNode.right;            if(parent == null) {                root = realNodeRight;                return;            } else {                if(parent.left == realNode) {                    parent.left = realNodeRight;                } else if(parent.right == realNode) {                    parent.right = realNodeRight;                }                if(realNodeRight != null)                    realNodeRight.parent = parent;                return;            }        } else {            Node parent = realNode.parent;            Node realNodeRight = realNode.right;            parent.left = realNodeRight;            if(realNodeRight != null)                realNode.parent = parent;            return;        }    }    @Override    public boolean findValue(Comparable val) {        Node res = findNode(root, val);        return res == null;    }    @Override    public void print() {        printTree(root);        System.out.println();    }    private void printTree(Node node){        if(node == null) return;        System.out.print(node.value + " ");        printTree(node.left);        printTree(node.right);    }    private Node findNode(Node parent, Comparable val) {        if(parent == null) return null;        int compare_res = parent.value.compareTo(val);        if(compare_res == 0) return parent;        if(compare_res == -1) {            return findNode(parent.right, val);        }        if(compare_res == 1) {            return findNode(parent.left, val);        }        return null;    }    class HasTheValueAlreadyException extends Exception {        public HasTheValueAlreadyException(String s){            super(s);        }    }    class WithoutValueException extends Exception {        public WithoutValueException(String s) {            super(s);        }    }}
public class Node<T extends Comparable<T>> {    protected T value;    protected Node parent;    protected Node left;    protected Node right;    public Node(T val) {        this.value = val;    }    public T getValue() {        return value;    }    public void setValue(T value) {        this.value = value;    }    public Node getParent() {        return parent;    }    public void setParent(Node parent) {        this.parent = parent;    }    public Node getLeft() {        return left;    }    public void setLeft(Node left) {        this.left = left;    }    public Node getRight() {        return right;    }    public void setRight(Node right) {        this.right = right;    }}
public class Test {    public static void main(String[] args) {        BinarySearchTree binarySearchTree =                new BinarySearchTree();        try {            binarySearchTree.addValue(45);            binarySearchTree.addValue(24);            binarySearchTree.addValue(53);            binarySearchTree.addValue(12);            binarySearchTree.addValue(37);            binarySearchTree.addValue(93);            binarySearchTree.removeValue(45);            binarySearchTree.print();        } catch (BinarySearchTree.HasTheValueAlreadyException e) {            e.printStackTrace();        } catch (BinarySearchTree.WithoutValueException e) {            e.printStackTrace();        }    }}
原创粉丝点击