二叉搜索树(java)

二叉搜索树可以算是基于二叉排序树的,差别在于其中有个查找(其实也就是递归遍历),所以可以说跟二叉排序是基本一致的。

上代码:

class TreeNode {
    int value;
    TreeNode left_node;
    TreeNode right_node;
    public TreeNode(int value) {
        this.value = value;
        this.left_node = null;
        this.right_node = null;
    }
}

public class BinarySearchTree {
    public TreeNode rootNode;
    public static int count = 1;

    public void Add_Node_To_Tree(int value) {
        if(rootNode == null) {
            rootNode = new TreeNode(value);
            return;
        }
        TreeNode currentNode = rootNode;
        while (true) {
            if(value < currentNode.value) {
                if(currentNode.left_node == null) {
                    currentNode.left_node = new TreeNode(value);
                    return;
                }
                else {
                    currentNode = currentNode.left_node;
                }
            }
            else {
                if(currentNode.right_node == null) {
                    currentNode.right_node = new TreeNode(value);
                    return;
                }
                else {
                    currentNode = currentNode.right_node;
                }
            }
        }
    }

    public boolean findTree(TreeNode node, int value) {
        if(node == null) {
            return false;
        }
        else if(node.value == value) {
            System.out.println("共搜索" + count + "次");
            return true;
        }
        else if(value < node.value) {
            count+=1;
            return findTree(node.left_node, value);
        }
        else {
            count+=1;
            return findTree(node.right_node, value);
        }
    }

    public static void main(String[] args) throws IOException {
        int i, value;
        BinarySearchTree tree = new BinarySearchTree();
        int arr[] = {7, 4, 1, 5, 13, 8, 11, 12, 15, 9, 2};
        System.out.println("原型数组内容:");
        for(i=0;i<11;i++) {
            System.out.print("[" + arr[i] + "]");
        }
        System.out.println();
        for (i=0;i<11;i++) {
            tree.Add_Node_To_Tree(arr[i]);
        }
        System.out.print("请输入搜索值: ");
        BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
        value = Integer.parseInt(keyin.readLine());
        if(tree.findTree(tree.rootNode, value)) {
            System.out.println("您要找的值 [" + value + "] 已经找到!");
        } else {
            System.out.println("抱歉没有找到!");
        }
    }
}

这里写图片描述

### 关于二叉搜索树的定义及其在 Java 中的实现 #### 定义与特性 二叉搜索树(Binary Search Tree),又称二叉排序树,是一种特殊的二叉树结构。它具有如下性质[^3]: - 左子树上的所有节点值均小于根节点的值; - 右子树上的所有节点值均大于根节点的值; - 左右子树本身也是二叉搜索树。 通过这些性质可以推导出一个重要结论:对一棵二叉搜索树进行中序遍历得到的结果是一个升序排列的序列。 #### 基本操作概述 对于二叉搜索树的操作主要包括以下几个方面: 1. **查找操作** 查找指定值是否存在可以通过递归的方式完成。从根节点开始比较目标值与当前节点值的关系,逐步向左或向右移动直到找到匹配项或者到达空节点为止[^2]。 2. **插入操作** 插入新节点的过程类似于查找过程,在定位到合适位置后创建新的叶节点并将其链接至父节点之下[^4]。 3. **删除操作** 删除某个特定值对应的节点较为复杂,需考虑三种情况: - 节点无子女; - 节点只有一个孩子; - 节点有两个孩子,则需要用该节点右子树中最小子节点替代被删节点的位置。 以下是基于以上描述的一个简单 Java 实现示例: ```java class TreeNode { int value; TreeNode left, right; public TreeNode(int item) { this.value = item; left = right = null; } } public class BinarySearchTree { private TreeNode root; // 添加节点的方法 void insert(int key) { root = insertRec(root, key); } /* 递归方式插入 */ TreeNode insertRec(TreeNode root, int key) { if (root == null) { root = new TreeNode(key); return root; } if (key < root.value) root.left = insertRec(root.left, key); else if (key > root.value) root.right = insertRec(root.right, key); return root; } // 查找节点的方法 boolean search(int key){ return searchRec(root,key)!=null; } /* 递归方式查找 */ TreeNode searchRec(TreeNode root,int key){ if(root==null || root.value == key) return root; if(root.value>key) return searchRec(root.left,key); return searchRec(root.right,key); } } ``` 此代码片段展示了如何构建基本功能的二叉搜索树类 `BinarySearchTree` 并提供了简单的插入和查询函数。 ### 应用领域 二叉搜索树因其高效的检索性能广泛应用于各种实际场景之中,比如数据库索引建立、动态集合管理等领域都有其身影出现。另外像 TreeMap 和 TreeSet 这样的高级容器内部实际上是依赖调整过的版本即红黑树来维持元素间顺序关系从而达到更优的时间效率表现[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值