二叉排序树代码实现(java版)(上)

简介: 二叉排序树代码实现(java版)

一、定义

1、一棵空树,或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树

(4)没有键值相等的结点。

二、基础代码

1、先定义一个节点类,包括左节点、右节点、值三个实例变量。

public class Node {
    private Node leftNode;
    private Node rightNode;
    private int value;
    public Node(int value) {
        this.value = value;
    }
}

2、定义一个二叉排序树类,包括根节点。

public class BinarySortTree {
    private Node root;
}

3、开发测试类,用于测试。

(1)测试类中我们定义类一个arr数组,使用for循环生成节点添加到树中,该add()方法的下面会讲到。

public class Test {
    public static void main(String[] args) {
        int[] arr = new int[]{7, 3, 10, 12, 5, 1, 9};
        BinarySortTree tree = new BinarySortTree();
        for (int i : arr) {
            tree.addNode(new Node(i));
        }
    }
}

三、插入节点

1、实现思路:

在二叉排序树中肯定需要一个add方法来添加节点,如果是一颗空树,我们直接将节点添加到根节点就行了,如果不是空树,我们肯定得递归调用节点的add方法了,因为根据二叉排序数的概念,左叶子节点的值<父节点的值<右节点的值,所以我们每次拿到当前节点,都需要判断当前节点与添加节点的值,看往左节点添加还是右节点添加,递归下去,只到找到要添加节点的位置为空时,递归停止,直接将节点添加。


2、代码如下:


(1)树类的add()方法

    public void addNode(Node node) {
        if (root == null) {
            root = node;
        } else {
            root.add(node);
        }
    }

(2)节点类的add()方法

   public void add(Node node) {
        if (node == null) {
            return;
        }
        if (this.value > node.value) {
            if (this.leftNode == null) {
                this.leftNode = node;
            } else {
                this.leftNode.add(node);
            }
        } else {
            if (this.rightNode == null) {
                this.rightNode = node;
            } else {
                this.rightNode.add(node);
            }
        }
    }

四、遍历排序二叉树


    上面我们实现了添加节点,接下来实现排序二叉树的遍历,根据定义和插入节点可知,要想得到一个有序的遍历,只有中序排序才能实现,因为中序遍历是按照左节点,然后父节点,最后右节点的顺序遍历,我们插入就是实现了左节点值<父节点值<右节点。如果使用前序或者后序遍历,出来的就无序了。


1、在树类中添加遍历方法


(1)遍历时,我们需要先判断根节点是否为空,如果为空,直接返回即可,不为空再调用节点类的排序方法。

    public void middleSort() {
        if (root == null) {
            return;
        }
        root.middleSort();
    }

2、在节点类中添加遍历方法

(1)先判断左节点是否有值,如果有,我们就让左节点接着调用遍历方法,只到左节点为空了,我们打印当前节点的值,当前节点就是父节点,然后再判断右节点,不为空就递归调用。

    public void middleSort() {
        if (this.leftNode != null) {
            this.leftNode.middleSort();
        }
        System.out.println(this.value);
        if (this.rightNode != null) {
            this.rightNode.middleSort();
        }
    }
目录
相关文章
|
5月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
454 6
|
6月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
796 3
|
6月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
740 3
|
6月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
321 4
|
7月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
217 2
|
5月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
319 115
|
5月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
231 98
|
6月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
519 0
|
8月前
|
Java 数据安全/隐私保护
快手小红书抖音留痕工具,自动留痕插件工具,java代码开源
这个框架包含三个核心模块:主操作类处理点赞评论、配置管理类和代理管理类。使用时需要配合