欢迎访问宙启技术站
智能推送

如何使用Java函数实现搜索二叉树

发布时间:2023-06-13 18:46:58

搜索二叉树(Binary Search Tree,BST)是一种经典的数据结构,它具有高效的查找、插入、删除等操作时间复杂度,常用于实现关联数据的存储与查询。Java 语言提供了多种数据结构和算法的标准实现(如 TreeMap、HashSet 等),也支持自定义实现 BST。本文将介绍如何使用 Java 函数实现搜索二叉树,包括 BST 的定义、插入、查询、删除等操作。

1. BST 的定义

BST 是一种二叉树,每个节点都包含一个值和两个指向左右子节点的指针。它的特殊之处在于,对于每个节点,左子树中所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。因此,可以使用 BST 实现快速地查找某个值,或者在已有的数据集合中插入或删除某个值。

在 Java 中,可以定义一个 BST 节点类:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

对于 BST 而言,可以定义一个 BST 类。它包含一个根节点,支持插入、查找、删除等操作:

public class BST {
    private TreeNode root;
    
    //插入操作
    public void insert(int val) { ... }
    
    //查找操作
    public boolean search(int val) { ... }
    
    //删除操作
    public void delete(int val) { ... }
}

2. 插入操作

对于插入操作而言,可以遍历树,找到合适的位置插入新节点。插入操作的实现流程如下:

- 首先,从根节点开始遍历 BST。

- 如果 BST 为空,则将新节点插入到根节点。

- 如果新节点的值小于当前节点的值,则向左子树遍历。

- 如果新节点的值大于当前节点的值,则向右子树遍历。

- 重复上述步骤,直到找到不为空的位置,将新节点插入到该节点处。

对应的 Java 代码如下:

    public void insert(int val) {
        if (root == null) {
            root = new TreeNode(val);
            return;
        }
        TreeNode node = root;
        while (true) {
            if (val < node.val) {
                if (node.left == null) {
                    node.left = new TreeNode(val);
                    break;
                }
                node = node.left;
            } else {
                if (node.right == null) {
                    node.right = new TreeNode(val);
                    break;
                }
                node = node.right;
            }
        }
    }

3. 查找操作

对于查找操作而言,可以遍历树,查找对应的节点。查找操作的实现流程如下:

- 首先,从根节点开始遍历 BST。

- 如果当前节点为空,则返回查找失败。

- 如果查找的值等于当前节点的值,则返回查找成功。

- 如果查找的值小于当前节点的值,则向左子树遍历。

- 如果查找的值大于当前节点的值,则向右子树遍历。

- 重复上述步骤,直到找到对应节点为止。

对应的 Java 代码如下:

    public boolean search(int val) {
        TreeNode node = root;
        while (node != null) {
            if (val == node.val) {
                return true;
            } else if (val < node.val) {
                node = node.left;
            } else {
                node = node.right;
            }
        }
        return false;
    }

4. 删除操作

对于删除操作而言,需要考虑多种情况,如删除的节点是否为叶子节点、是否有一个子节点、是否有两个子节点等。删除操作的实现流程如下:

- 首先,从根节点开始遍历 BST。

- 如果当前节点为空,则返回删除失败。

- 如果需要删除的值小于当前节点的值,则向左子树遍历。

- 如果需要删除的值大于当前节点的值,则向右子树遍历。

- 如果需要删除的值等于当前节点的值:

(1)如果当前节点是叶子节点,则直接删除该节点;

(2)如果当前节点有一个子节点,则用该子节点替换当前节点;

(3)如果当前节点有两个子节点,则找到右子树中的最小节点,用其替换当前节点,并删除该最小节点。

- 重复上述步骤,直到找到需要删除的节点。

对应的 Java 代码如下:

    public void delete(int val) {
        TreeNode parent = null;
        TreeNode node = root;
        while (node != null && node.val != val) {
            parent = node;
            if (val < node.val) {
                node = node.left;
            } else {
                node = node.right;
            }
        }
        if (node == null) return; // not found
        if (node.left == null && node.right == null) {
            if (node == root) {
                root = null;
            } else if (node == parent.left) {
                parent.left = null;
            } else {
                parent.right = null;
            }
        } else if (node.left == null) {
            if (node == root) {
                root = node.right;
            } else if (node == parent.left) {
                parent.left = node.right;
            } else {
                parent.right = node.right;
            }
        } else if (node.right == null) {
            if (node == root) {
                root = node.left;
            } else if (node == parent.left) {
                parent.left = node.left;
            } else {
                parent.right = node.left;
            }
        } else {
            TreeNode minNode = node.right;
            while (minNode.left != null) {
                minNode = minNode.left;
            }
            int minVal = minNode.val;
            delete(minVal);
            node.val = minVal;
        }
    }

5. 测试

可以编写一个主函数,测试 BST 的基本操作:

public static void main(String[] args) {
    BST bst = new BST();
    bst.insert(5);
    bst.insert(3);
    bst.insert(2);
    bst.insert(4);
    bst.insert(7);
    bst.insert(6);
    bst.insert(8);
    System.out.println(bst.search(5)); // true
    System.out.println(bst.search(2)); // true
    System.out.println(bst.search(9)); // false
    bst.delete(2);
    bst.delete(5);
    System.out.println(bst.search(2)); // false
    System.out.println(bst.search(5)); // false
    System.out.println(bst.search(3)); // true
}

测试结果如下:

true
true
false
false
false
true