简单用Java实现二分搜索树

  • 二叉树由节点(Node)组成,每个节点包含一个“左”指针(left)、“右”指针(right)和一个数据元素(e)。

  • “根”(root)指针指向树中最顶端的节点。左右指针递归地指向较小的

  • 两边的“子树”。空指针表示没有元素的二叉树——空树。正式的递归定义是:二叉树要么为空(由空指针表示),要么由单个节点构成,

  • 其中左指针和右指针(前面是递归定义)都指向一个二叉树。

上图是一棵二分搜索树(BST):

  • 二分搜索树是二叉树
  • 二分搜索树的每个节点的值都大于其左子树的所有节点的值,小于其右子树的所有节点的值(1,3,4)<5<(6,9)
  • 其中(1,4,6)是树的叶子节点,因为其节点的left和right指针是空子树。

由于二分搜索树具有元素之间比较的特点,所以二分搜索树存储的元素类型应该要具有可比较性。可以为二分搜索树添加泛型E,并且E extends Comparable<E>

这里我的二分搜索树存储的元素类型就指定为int,且其他方法都用递归实现

public class BST {
    private class Node {
        int e;
        Node left;
        Node right;

        public Node(int e) {
            this.e = e;
            left = null;
            right = null;
        }
    }

    private Node root;
    private int size;

    public BST() {
        this.root = null;
        this.size = 0;
    }

}

查找方法:

public boolean lookup(Node node,int target){
    //最基本的情况:空树,找不到目标,所以返回false
    if (node == null)
        return false;
    //如果不为空,则根据值来判断
    else {
        if (target == node.e)
            return true;
        else {
            if (target < node.e)
                return lookup(node.left,target);
            else return lookup(node.right,target);
        }
    }
}

插入元素方法:

public void insert(int data){
    root = insert(root,data);
}
private Node insert(Node node,int data){
    //如果节点是空的,则返回一个新的节点,值为data
    if (node == null){
        size++;
        return new Node(data);
    }
    //如果节点不为空,则根据data和e对比
    else {
        if (data < node.e) node.left = insert(node.left,data);
        else node.right = insert(node.right,data);
        return node;
    }
}

getSize方法:

public int getSize(){
    return size;
}

获取树的最大深度方法:

public int maxDepth(){
    return maxDepth(root);
}
private int maxDepth(Node node){
    if (node == null)
        return 0;
    else {
        int lDepth = maxDepth(node.left);
        int rDepth = maxDepth(node.right);
        return Math.max(lDepth,rDepth)+1;
    }
}

先序遍历、中序遍历、后序遍历:

public void preOrder(){
    preOrder(root);
}
private void preOrder(Node node){
    if (node == null)
        return;
    System.out.println(node.e);
    preOrder(node.left);
    preOrder(node.right);
}
public void inOrder(){
    inOrder(root);
}
private void inOrder(Node node){
    if (node==null)
        return;
    inOrder(node.left);
    System.out.println(node.e);
    inOrder(node.right);
}

public void postOrder(){
    postOrder(root);
}
private void postOrder(Node node){
    if (node==null)
        return;
    postOrder(node.left);
    postOrder(node.right);
    System.out.println(node.e);
}

猜你喜欢

转载自www.cnblogs.com/AACFHFZFZE/p/12303531.html
今日推荐