二叉查找树的java实现

二叉查找树

1. 定义

在这里插入图片描述

  1. 若左子树不空,则左子树上所有结点的值均小于它的根结点的值
  2. 若右子树不空,则右子树上所有结点的值均大于它的根结点的值
  3. 左、右子树也分别为二叉查找树
  4. 没有键值相等的结点

2. 增删查

2.1 插入

在这里插入图片描述

 public void insert(T val) {
    if (val == null)
        throw new NullPointerException();
    root = insert(val, root);
}

/**
 * 插入方法的实际执行
 */
private Node<T> insert(T val, Node<T> t) {
    if (root == null) {
        return new Node<>(val, null, null);
    }
    int compareRes = val.compareTo(root.value);
    if (compareRes > 0) {
        root.right = insert(val, root.right);
    } else if (compareRes < 0) {
        root.left = insert(val, root.left);
    }
    return t;
}
2.2 查找

查找树中是否包含此值

/**
 * 查看二叉树中是否包含此值
 */
public boolean contains(T val) {
    if (val == null) {
        throw new NullPointerException();
    }
    return contains(val, root);
}
private boolean contains(T val, Node<T> t) {
    if (t == null) {
        return false;
    }
    int compareRes = val.compareTo(t.value);
    if (compareRes > 0) {
        return contains(val, t.right);
    } else if (compareRes < 0) {
        return contains(val, t.left);
    } else {
        return true;
    }
}
2.3 查找最大值
/**
 * 获取最大值
 */
public T findMax() {
    if (root == null) {
        return null;
    }
    return findMax(root).value;
}
private Node<T> findMax(Node<T> t) {
    while (t.right != null)
        t = t.right;
    return t;

2.4 查找最小值
/**
 * 获取最小值
 */
public T findMin() {
    if (root == null) {
        return null;
    }
    return findMin(root).value;
}
private Node<T> findMin(Node<T> t) {
    while (t.left != null) {
        t = t.left;
    }
    return t;
}
2.5 删除

在这里插入图片描述

public Node<T> delete(T val) {
    if (val == null)
        throw new NullPointerException();
    return delete(val, root);
}
private Node<T> delete(T val, Node<T> t) {
    if (t == null)
        return null;
    int compareRes = val.compareTo(t.value);
    if (compareRes > 0)
        delete(val, t.right);
    else if (compareRes < 0)
        delete(val, t.left);
    else if (t.left != null && t.right != null) {
        Node<T> temp = findMin(t.right);
        t.value = temp.value;
        delete(val,temp);
    }else
        t = (t.left ==null ? t.right:t.left);
    return t;
}
好的,下面是一份基本的二叉查找树Java 实现代码: ``` public class BinarySearchTree { private Node root; private class Node { private int key; private Node left; private Node right; public Node(int key) { this.key = key; this.left = null; this.right = null; } } public BinarySearchTree() { root = null; } public void insert(int key) { root = insert(root, key); } private Node insert(Node node, int key) { if (node == null) { node = new Node(key); return node; } if (key < node.key) { node.left = insert(node.left, key); } else if (key > node.key) { node.right = insert(node.right, key); } return node; } public void delete(int key) { root = delete(root, key); } private Node delete(Node node, int key) { if (node == null) { return null; } if (key < node.key) { node.left = delete(node.left, key); } else if (key > node.key) { node.right = delete(node.right, key); } else { if (node.left == null) { return node.right; } else if (node.right == null) { return node.left; } node.key = findMin(node.right).key; node.right = delete(node.right, node.key); } return node; } private Node findMin(Node node) { while (node.left != null) { node = node.left; } return node; } public boolean search(int key) { return search(root, key); } private boolean search(Node node, int key) { if (node == null) { return false; } if (key == node.key) { return true; } else if (key < node.key) { return search(node.left, key); } else { return search(node.right, key); } } public void inorderTraversal() { inorderTraversal(root); } private void inorderTraversal(Node node) { if (node != null) { inorderTraversal(node.left); System.out.print(node.key + " "); inorderTraversal(node.right); } } } ``` 这份代码实现二叉查找树的基本操作,包括插入、删除、搜索和中序遍历。你可以根据自己的需求进行修改和拓展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值