首页 > 编程语言 >如何使用Java程序实现二叉数

如何使用Java程序实现二叉数

时间:2023-04-03 20:45:35浏览次数:33  
标签:node 遍历 Java val 程序实现 二叉 二叉树 TreeNode 节点

二叉树是一种重要的数据结构,它由一组节点组成,每个节点可以拥有最多两个子节点。使用Java可以很容易地实现一个二叉树。下面将介绍如何使用Java实现二叉树。

二叉树的节点定义

一个二叉树的节点可以定义为一个类,其中至少需要包含以下属性:

  1. 节点值
  2. 左子节点
  3. 右子节点

在Java中,我们可以通过如下方式定义一个二叉树节点类:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int x) {
        val = x;
    }
}

这个类定义了一个整型 val 值,以及左右子节点 left 和 right。如果需要在节点中存储更多数据,可以添加相应的属性和构造函数。

实现二叉树的操作

下面是一些常用的二叉树操作:

  • 添加新节点
  • 遍历二叉树(前序、中序、后序遍历)
  • 查找二叉树中的值
  • 获取二叉树的最大值、最小值

下面将介绍如何实现这些操作。

添加新节点

添加新节点需要首先创建一个新节点的对象,然后将它添加到二叉树中。添加新节点的方法定义如下:

public void insert(int val) {
    root = insert(root, val);
}

private TreeNode insert(TreeNode node, int val) {
    if (node == null) {
        return new TreeNode(val);
    }
    if (val < node.val) {
        node.left = insert(node.left, val);
    } else if (val > node.val) {
        node.right = insert(node.right, val);
    }
    return node;
}

这个方法接受一个整型值 val,并将其插入到二叉树中。首先,我们使用一个私有方法 insert 来实现节点的插入操作。如果当前节点为 null,说明这个节点可以存储新节点,我们创建一个新的节点并返回。否则,我们比较 val 和当前节点的值,如果 val 比当前节点小,则向左子树递归调用 insert 方法。如果 val 比当前节点大,则向右子树递归调用 insert 方法。递归调用最终会返回一个节点,我们要将父节点的左子节点或右子节点设置为这个节点,然后返回当前节点。

遍历二叉树

遍历二叉树分为前序遍历、中序遍历和后序遍历。下面分别介绍如何实现这三种遍历。

前序遍历

前序遍历是从根节点开始,先遍历左子树,再遍历右子树。对于每个节点来说,先访问它本身,然后递归遍历左子树和右子树。使用递归方式实现前序遍历的代码如下:

public void preorder() {
    preorder(root);
}

private void preorder(TreeNode node) {
    if (node != null) {
        System.out.print(node.val + " ");
        preorder(node.left);
        preorder(node.right);
    }
}

这个方法接受根节点 root,然后递归遍历整个二叉树。如果当前节点不为 null,则首先访问当前节点 node,然后递归遍历 node 的左子节点和右子节点。

中序遍历

中序遍历是按照左子树、根节点、右子树的顺序遍历二叉树节点。同样可以使用递归方式来实现中序遍历:

public void inorder() {
    inorder(root);
}

private void inorder(TreeNode node) {
    if (node != null) {
        inorder(node.left);
        System.out.print(node.val + " ");
        inorder(node.right);
    }
}

这个方法同样接受根节点 root,然后递归遍历整个二叉树。与前序遍历不同的是,中序遍历首先遍历左子节点,然后访问当前节点,最后遍历右子节点。

后序遍历

后序遍历是先遍历左子树,再遍历右子树,最后访问根节点。同样可以使用递归方式实现后序遍历:

public void postorder() {
    postorder(root);
}

private void postorder(TreeNode node) {
    if (node != null) {
        postorder(node.left);
        postorder(node.right);
        System.out.print(node.val + " ");
    }
}

这个方法同样接受根节点 root,然后递归遍历整个二叉树。与前序遍历和中序遍历不同的是,后序遍历首先遍历左子节点,然后遍历右子节点,最后访问当前节点。

查找二叉树中的值

要查找二叉树中是否存在某一个值,我们可以使用递归方式进行查找。如果当前节点的值等于查找值,则返回该节点,如果当前节点的值小于查找值,则递归查找右子树,否则递归查找左子树。如果没有找到,则返回 null。下面是查找二叉树中是否存在某一个值的方法:

public TreeNode find(int val) {
    return find(root, val);
}

private TreeNode find(TreeNode node, int val) {
    if (node == null || node.val == val) {
        return node;
    }
    if (val < node.val) {
        return find(node.left, val);
    } else {
        return find(node.right, val);
    }
}

获取二叉树的最大值、最小值

获取二叉树的最大值,可以顺着二叉树的右子树一直往下走,直到找到最右边的叶子节点。获取二叉树的最小值同理,可以顺着左子树往下找到最左边的叶子节点。下面是获取二叉树的最大值和最小值的方法:

public int findMax() {
    return findMax(root).val;
}

private TreeNode findMax(TreeNode node) {
    if (node.right == null) {
        return node;
    }
    return findMax(node.right);
}

public int findMin() {
    return findMin(root).val;
}

private TreeNode findMin(TreeNode node) {
    if (node.left == null) {
        return node;
    }
    return findMin(node.left);
}

总结

本文介绍了如何使用Java实现一个二叉树和一些常用的操作,包括添加新节点、遍历二叉树、查找二叉树中的值、获取二叉树的最大值和最小值。二叉树是一种非常重要的数据结构,在实际开发中经常使用,希望本文对您有所帮助。

标签:node,遍历,Java,val,程序实现,二叉,二叉树,TreeNode,节点
From: https://www.cnblogs.com/futureman/p/17284351.html

相关文章

  • Java多线程
    1.可见性、原子性和有序性问题多线程有三大特性,分别是可见性、原子性和有序性。1.1可见性  在单核时代,所有的线程都是在一颗CPU上执行,CPU缓存与内存的数据一致性容易解决。因为所有线程都是操作同一个CPU的缓存,一个线程对缓存的写,对另外一个线程来说一定是可见的。一个线程......
  • Java判断文件夹、文件是否存在,不存在则新建
    Java判断文件夹、文件是否存在,不存在则新建原文链接:https://blog.csdn.net/asfsdgdfgdf/article/details/1283162781、Java判断是否存在文件夹,不存在则新建Filefile=newFile("D:/test/filetest/test.txt");if(!file.getParentFile().exists()){file.getParentFile().......
  • Java 获取当前或调用者类名和方法名(Thread.currentThread().getStackTrace()、new Thr
    Java获取当前或调用者类名和方法名(Thread.currentThread().getStackTrace()、newThrowable().getStackTrace())原文链接:https://blog.csdn.net/inthat/article/details/111885544文章目录一、Java获取当前类名和方法名Thread.currentThread().getStackTrace()1.关于Thr......
  • 2-Java基础语法
    1.注释注释是对代码的解释和说明文字。Java中的注释分为三种:单行注释://这是单行注释文字多行注释:/_这是多行注释文字这是多行注释文字这是多行注释文字_/注意:多行注释不能嵌套使用。文档注释(暂时用不到):/*_这是多行注释文字这是多行注释文字这是多......
  • 如何用Java程序生成大乐透号码?
    在大乐透游戏中,需要选出5个红球号码和2个蓝球号码。这个过程可能比较耗时,而且如果想要生成多组号码,手动输入的方式就变得特别不切实际。因此,我们可以使用Java程序来实现大乐透号码的自动生成。一、生成红球号码首先,需要确定生成红球号码的范围和数量。在大乐透游戏中,红球号码的......
  • 关闭Java时后台的FM无法恢复
    在MVM的版本中,先启动任何本地播放音乐的应用FM/Audioplayer,此时同时启动多个没有音乐的Java应用,并关闭某一个Java应用,之前后台的FM等无法重新恢复播放。例如: 1、启动FM->启动Java应用A,FM停止播放->后台A->FM恢复->启动Java应用B,FM停止播放->后台......
  • JAVA列表中屏蔽预置程序
    1.Jam_interface.h中添加FilterType。 typedefenum{JAM_NONE_FILTER=0,JAM_DISK_FILTER=0x01,JAM_TRUST_FILTER=0x02,JAM_VENDOR_FILTER=0x04,JAM_DEFAULT_GAME_FILTER=0x08,JAM_NONDEFAULT_GAME_FILTER=......
  • 55个手机JAVA全屏触屏游戏
    55个游戏我就不一一列举名字了,适合所有触屏手机,全触屏游戏,大部分测试通过,太多了我也没一个一个看,保证能玩就行了thunder://QUFodHRwOi8vd3d3Ljc4eXguY29tL3NvcnQvbWRvd24vMS81NSVCOCVGNiVDQSVENiVCQiVGQUpBVkElQzglQUIlQzYlQzElQjQlQTUlQzYlQzElRDMlQ0UlQ0YlQjcucmFyWlo=......
  • Java记录唯一性check
    /***记录唯一性check**@paramid主键*@paramentity实体记录,必须实现equals()方法才能验证更新的场合*@paramfields唯一键字段名称*/if(entity==null||fields.length==0){return;}try{@SuppressWarnings("unchecked")......
  • 解决java注解处理器生成的方法,在编译时报错“找不到符号”
    我的注解处理器,添加的其中一个方法中有一段AST代码如下:JCTree.JCFieldAccessobjectsIsNull=maker.Select(maker.Ident(names.fromString("java.util.Objects")),names.fromString("isNull"));JCTree.JCIfifExpr1=maker.If(maker.Apply(List.nil(),objectsI......