带你了解Java数据结构和算法之二叉树

yizhihongxing

带你了解Java数据结构和算法之二叉树

前言

二叉树是计算机科学中的重要数据结构之一,可以用于实现许多算法和系统。本文将介绍二叉树的基本概念、常见操作、遍历方式等内容,并通过示例详细展示其应用。

二叉树的定义

二叉树是一种树形结构,其每个节点最多有两个子节点,被称为左子节点和右子节点。二叉树具有以下几个特点:

  • 每个节点最多有两个子节点
  • 左子树和右子树也是二叉树
  • 如果二叉树的左子树不为空,则左子树上所有节点的值小于此节点的值
  • 如果二叉树的右子树不为空,则右子树上所有节点的值大于此节点的值

二叉树的操作

插入节点

要插入一个节点,在访问其父节点的时候,需要对其值进行比较。如果比父节点值小,就在左子树中插入,否则就在右子树中插入。如下是在 Java 中插入节点的代码示例:

public void insert(int value){
    if(root == null){
        root = new TreeNode(value);
    }else{
        root.insert(value);
    }
}

查找节点

查找节点可以通过递归方式完成,如果查找到的节点的值等于要查找的值,则返回该节点,否则在左子树和右子树中继续查找。如下是在 Java 中查找节点的代码示例:

public TreeNode find(int value){
    if(root == null){
        return null;
    }else{
        return root.find(value);
    }
}

删除节点

删除节点时如果要删除的节点没有子节点,则直接删除;如果有一个子节点,则用其子节点代替删除节点;如果有两个子节点,则找到右子树上最小的节点,将其值赋给要删除的节点,再删除这个最小节点。如下是在 Java 中删除节点的代码示例:

public void delete(int value){
    root = delete(root, value);
}

private TreeNode delete(TreeNode subTree, int value){
    if(subTree == null){
        return null;
    }
    if(value < subTree.val){
        subTree.left = delete(subTree.left, value);
    }else if(value > subTree.val){
        subTree.right = delete(subTree.right, value);
    }else{
        if(subTree.left != null && subTree.right != null){
            subTree.val = findMin(subTree.right).val;
            subTree.right = delete(subTree.right, subTree.val);
        }else{
            subTree = (subTree.left != null) ? subTree.left : subTree.right;
        }
    }
    return subTree;
}

private TreeNode findMin(TreeNode subTree){
    while(subTree.left != null){
        subTree = subTree.left;
    }
    return subTree;
}

二叉树的遍历方式

前序遍历

前序遍历是以根-左-右的顺序进行遍历,即先访问节点,然后遍历左子树,最后遍历右子树。如下是 Java 中实现前序遍历的代码示例:

public void preOrder(TreeNode treeNode){
    if(treeNode != null){
        System.out.println(treeNode.val);
        preOrder(treeNode.left);
        preOrder(treeNode.right);
    }
}

中序遍历

中序遍历是以左-根-右的顺序进行遍历,即先遍历左子树,然后访问节点,最后遍历右子树。如下是 Java 中实现中序遍历的代码示例:

public void inOrder(TreeNode treeNode){
    if(treeNode != null){
        preOrder(treeNode.left);
        System.out.println(treeNode.val);
        preOrder(treeNode.right);
    }
}

后序遍历

后序遍历是以左-右-根的顺序进行遍历,即先遍历左子树,然后遍历右子树,最后访问节点。如下是 Java 中实现后序遍历的代码示例:

public void postOrder(TreeNode treeNode){
    if(treeNode != null){
        preOrder(treeNode.left);
        preOrder(treeNode.right);
        System.out.println(treeNode.val);
    }
}

示例说明

以下是一个使用递归方式创建并添加节点的示例:

public void recursiveInsert(int value, TreeNode treeNode){
    if(root == null){
        root = new TreeNode(value);
    }else{
        if(value < treeNode.val){
            if(treeNode.left != null){
                recursiveInsert(value, treeNode.left);
            }else{
                System.out.println("Inserted " + value + " to left of node " + treeNode.val);
                treeNode.left = new TreeNode(value);
            }
        }else if(value > treeNode.val){
            if(treeNode.right != null){
                recursiveInsert(value, treeNode.right);
            }else{
                System.out.println("Inserted " + value + " to right of node " + treeNode.val);
                treeNode.right = new TreeNode(value);
            }
        }
    }
}

以下是一个使用前序遍历输出节点值的示例:

public void preOrderPrint(TreeNode treeNode){
    if(treeNode != null){
        System.out.print(treeNode.val + " ");
        preOrderPrint(treeNode.left);
        preOrderPrint(treeNode.right);
    }
}

通过以上示例,可以更好地理解如何对二叉树进行操作及遍历。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:带你了解Java数据结构和算法之二叉树 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C语言算术运算符整理

    C语言算术运算符整理 简介 C语言提供了一组算术运算符,可以对数字进行基本的数学计算。通常使用算术运算符来编写算法,实现数学公式等。本文将介绍C语言中常见的算术运算符及其使用。 算术运算符 C语言提供了以下算术运算符: 运算符 名称 说明 + 加法 对两个数进行加法运算 – 减法 对两个数进行减法运算 * 乘法 对两个数进行乘法运算 / 除法 对两个数进行除…

    other 2023年6月27日
    00
  • opencvsharp使用ssim指数衡量图片相似度

    OpenCvSharp使用SSIM指数衡量图片相似度 OpenCvSharp是一个基于OpenCV的C#封装库,它提供了许多图像处理和计算机视觉。其中,SSIM(结构似性)指数是一种用于衡量两幅图像相似度的指标。以下是关于OpenCvSharp使用SSIM指数衡量图片相似度的完整攻略: 1. SSIM指数简介 SSIM指数是一种用于衡量两幅图像相似度的指标,…

    other 2023年5月7日
    00
  • 怎么换云服务器? Discuz论坛完美搬家的图文教程

    下面是详细的攻略。 怎么换云服务器? Discuz论坛完美搬家的图文教程 确定目标云服务器 首先需要确定你要迁移的目标云服务器。可以选择国内的阿里云、腾讯云等,也可以选择海外的 AWS 等云服务器提供商。 准备工作 在迁移服务器之前,需要首先进行以下准备工作: 备份网站文件和数据库 备份网站文件:使用 FTP 工具将网站全部文件下载至本地,可以使用 File…

    other 2023年6月27日
    00
  • 深入sql oracle递归查询

    深入SQL Oracle递归查询 递归查询是一种常用的查询方式,特别是在层级关系查询。Oracle数据库支持递归查询,本文将深入讲解SQL Oracle递归查询的完整攻略,涵盖递归查询的用法、示例、及其它关键细节。 什么是递归查询? 递归查询就是在查询的过程中包含了自身,通常是用来查询树形结构的数据。递归查询可以将一组数据从根节点深入到查询所有子节点,从而得…

    other 2023年6月27日
    00
  • C++之谈谈构造函数的初始化列表

    我们来详细探讨一下C++中构造函数的初始化列表。 构造函数初始化列表的基本概念 在C++中,构造函数初始化列表是构造函数中赋值的一种特定方式。使用初始化列表可以方便地对对象的成员变量进行初始化,可以通过下面的方式实现: class MyClass { public: MyClass(int a, int b) : num1(a), num2(b) {} //…

    other 2023年6月20日
    00
  • AngularJs1.x自定义指令独立作用域的函数传入参数方法

    当然!下面是关于\”AngularJS 1.x自定义指令独立作用域的函数传入参数方法\”的完整攻略,包含两个示例说明。 … … … … … … … … … … … … … … … … … … … … … … …

    other 2023年8月20日
    00
  • fw.qq.com/ipaddress已失效 javascript获得客户端IP的新方法

    \”fw.qq.com/ipaddress已失效 javascript获得客户端IP的新方法\”攻略 背景 在过去,我们可以通过访问\”fw.qq.com/ipaddress\”来获取客户端的IP地址。然而,最近这个方法已经失效了。本攻略将介绍一种新的方法,使用JavaScript来获取客户端的IP地址。 步骤 步骤一:使用第三方服务 我们可以使用第三方服务…

    other 2023年7月31日
    00
  • windows开发记事本程序纪实(一)界面篇

    Windows开发记事本程序纪实(一)界面篇 界面设计 在这篇文章中,我将介绍如何使用C#语言开发Windows记事本程序的界面设计。 界面元素 记事本程序的界面主要由以下元素组成: 菜单栏 工具栏 状态栏 编辑区域 菜单栏和工具栏是记事本程序的主要功能区域,状态栏用于显示程序当前状态,编辑区域则是用户输入和显示文本的地方。 菜单栏设计 首先,我们需要设计记…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部