数据结构:二叉树

文章目录

  • 二叉树
    • 一,概述
    • 二,添加数据
    • 三,删除数据


二叉树

一,概述

二叉树是一种非线性数据结构,它由一系列节点组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的每个元素都有一个键,通过这个键可以从树中找到该元素。

二叉树具有以下性质:

  1. 每个节点最多有两个子节点,即左子节点和右子节点。
  2. 每个节点可以拥有任意数量的子节点,也可以没有子节点。
  3. 每个节点都有一个键,通过这个键可以识别节点。
  4. 除了根节点外,每个节点都有一个父节点。

二叉树的基本操作包括:

  1. 插入:向二叉树中插入一个新节点。
  2. 删除:从二叉树中删除一个节点。
  3. 查找:在二叉树中查找一个节点。
  4. 遍历:遍历二叉树中的所有节点。

二叉树的遍历方式有三种:前序遍历、中序遍历和后序遍历。

  1. 前序遍历:先访问根节点,然后遍历左子树,最后遍历右子树。
  2. 中序遍历:先遍历左子树,然后访问根节点,最后遍历右子树。
  3. 后序遍历:先遍历左子树,然后遍历右子树,最后访问根节点。

二叉树的应用非常广泛,例如在计算机科学中的搜索树、排序树、编码理论、数据压缩等领域都有应用。

简介

  • 二叉树是一种非线性数据结构,由一些称为节点的对象组成,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。
  • 二叉树的根是没有父节点的节点,叶子是没有子节点的节点。
  • 二叉树的高度是从根到所有叶子节点的最长路径上的节点数。
  • 二叉树有多种类型,如满二叉树、完全二叉树、平衡二叉树等。

图示

一个简单的二叉树如下:

    1/ \2   3/ \
4   5

在这个二叉树中,1是根节点,2和3是1的子节点,4和5是2的子节点。高度为3。

示例

在Java中,可以创建一个简单的二叉树类:

class Node {int key;Node left, right;public Node(int item) {key = item;left = right = null;}
}class BinaryTree {Node root;BinaryTree(int key) {root = new Node(key);}BinaryTree() {root = null;}// 更多的方法(如插入、搜索、删除等)可以在这里添加
}

在这个示例中,创建了一个Node类来表示二叉树的节点,每个节点都有一个键和两个子节点。还创建了一个BinaryTree类,它有一个根节点,并可以添加更多的方法来操作二叉树(例如插入、搜索和删除节点等)。

二,添加数据

在Java中,二叉树是一种常见的数据结构,它可以有效地组织和搜索数据。下面是一个示例,展示如何在二叉树中添加数据:

首先,需要创建一个表示二叉树节点的类:

public class TreeNode {int value;TreeNode left;TreeNode right;public TreeNode(int value) {this.value = value;this.left = null;this.right = null;}
}

然后,我们可以创建一个表示二叉树的类,并添加一个方法来添加数据:

public class BinaryTree {TreeNode root;public BinaryTree() {root = null;}public void add(int value) {root = addRecursive(root, value);}private TreeNode addRecursive(TreeNode current, int value) {if (current == null) {return new TreeNode(value);}if (value < current.value) {current.left = addRecursive(current.left, value);} else if (value > current.value) {current.right = addRecursive(current.right, value);} else {// value already exists in the tree, do nothingreturn current;}return current;}
}

这里,使用了递归方法addRecursive来找到应该插入新节点的位置。如果树为空,就在根节点插入新值。如果新值小于当前节点的值,将其插入到左子树;如果新值大于当前节点的值,将其插入到右子树。如果新值已经存在于树中,什么也不做。

现在,我们可以创建一个二叉树并向其中添加数据:

public class Main {public static void main(String[] args) {BinaryTree bt = new BinaryTree();bt.add(6);bt.add(4);bt.add(8);bt.add(3);bt.add(5);bt.add(7);bt.add(9);}
}

这是一个基本的二叉搜索树的实现,新添加的元素总是被放在正确的位置以保持树的排序属性。

三,删除数据

在Java中,二叉树是一种常见的数据结构,可以有效地组织和搜索数据。下面是一个示例,展示如何在二叉树中删除数据:

首先,需要创建一个表示二叉树节点的类:

public class TreeNode {int value;TreeNode left;TreeNode right;public TreeNode(int value) {this.value = value;this.left = null;this.right = null;}
}

然后,可以创建一个表示二叉树的类,并添加一个方法来删除数据:

public class BinaryTree {TreeNode root;public BinaryTree() {root = null;}public void remove(int value) {root = removeRecursive(root, value);}private TreeNode removeRecursive(TreeNode current, int value) {if (current == null) {return null;}if (value == current.value) {// Node with the given value found, remove it from the tree.if (current.left == null && current.right == null) {return null;} else if (current.left == null) {return current.right;} else if (current.right == null) {return current.left;} else {// Find the minimum value in the right subtree and replace it with the current node's value.TreeNode minNode = findMin(current.right);current.value = minNode.value;current.right = removeRecursive(current.right, minNode.value);return current;}} else if (value < current.value) {current.left = removeRecursive(current.left, value);return current;} else {current.right = removeRecursive(current.right, value);return current;}}private TreeNode findMin(TreeNode node) {while (node.left != null) {node = node.left;}return node;}
}

这里,使用了递归方法removeRecursive来找到应该删除节点的位置。如果要删除的节点没有子节点,直接返回null。如果要删除的节点只有一个子节点,将这个子节点返回作为新的节点。如果要删除的节点有两个子节点,找到右子树中的最小节点,用它替换要删除的节点,然后在右子树中递归删除这个最小节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch16-聚合API

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

unity学习第1天

本身也具有一些unity知识&#xff0c;包括Eidtor界面使用、Shader效果实现、性能分析&#xff0c;但对C#、游戏逻辑不太清楚&#xff0c;这次想从开发者角度理解游戏&#xff0c;提高C#编程&#xff0c;从简单的unity游戏理解游戏逻辑&#xff0c;更好的为工作服务。 unity201…

AWS创建实例 启用/禁用 自动分配公有 IP

给AWS新账户做完了对等连接&#xff0c;因为默认VPC网段都冲突 就换了VPC&#xff0c;然后发现新VPC内创建的实例都没有分配公网IP地址&#xff0c;自动分配公网IP地址变成了禁用。后续建机子需要手动修改成启用太麻烦了。 在VPC里面找到编辑子网设置&#xff0c;勾上启用自动…

【电子元件】常用电子元器件的识别之电阻器

目录 前言1. 电阻器的识别1.1 普通电阻器的识别1. 普通电阻器的识别色环电阻器绕线电阻器水泥电阻器贴片电阻器网络电阻器(排阻)保险电阻器精密电阻器2. 电阻器的符号3. 普通电阻器的主要参数标称阻值和允许误差额定功率最高工作电压温度系数1.2 电位器的识别1. 电位器的识别…

【C++初阶】C++STL详解(四)—— vector的模拟实现

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 【C初阶】CSTL详解&#xff08;三…

全国职业技能大赛云计算--高职组赛题卷①(容器云)

全国职业技能大赛云计算--高职组赛题卷①&#xff08;容器云&#xff09; 第二场次题目&#xff1a;容器云平台部署与运维任务1 Docker CE及私有仓库安装任务&#xff08;5分&#xff09;任务2 基于容器的web应用系统部署任务&#xff08;15分&#xff09;任务3 基于容器的持续…

给yarn/npm包管理设置代理加速nodejs依赖下载的方法

由于墙内网络干扰屏蔽国外网络的原因&#xff0c;在国内下载nodejs依赖是非常缓慢的。 所以为了解决这个问题&#xff0c;必须设置代理&#xff0c;具体方法如下&#xff1a; NPM设置代理&#xff1a; npm config set proxy<http_proxy> NPM删除代理&#xff1a; npm c…

React中的Hooks--useReducer()

首先&#xff0c;useReducer是React提供的一个钩子函数&#xff0c;用于管理组件内部的状态。它可以接收一个reducer函数和初始状态&#xff0c;并返回一个包含状态和更新状态的函数的数组。 与之相反&#xff0c;Redux是一个独立的状态管理库&#xff0c;它可以在整个应用程序…

Java8中判断一个对象不为空存在一个类对象是哪个

Java8中判断一个对象不为空存在一个类对象是哪个&#xff1f; 在Java 8中&#xff0c;你可以使用java.util.Optional类来处理可能为空的对象。Optional类可以帮助你优雅地处理空值情况&#xff0c;而不需要显式地进行空值检查。 这是一个简单的Optional示例&#xff1a; imp…

「UG/NX」Block UI 指定矢量SpecifyVector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

基于Java+SpringBoot+Vue的图书借还小程序的设计与实现(亮点:多角色、点赞评论、借书还书、在线支付)

图书借还管理小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 小…

什么是Webpack的Tree Shaking?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Webpack的Tree Shaking⭐ 作用和原理⭐ 使用 Tree Shaking⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感…

【vue组件】使用element-ui table 实现嵌套表格 点击展开时获取数据

应用场景是这样 主表格的数据是所有的学校 然后点击展开的时候&#xff0c;获取学校下相应班级的数据 并且班级要能选择后生成图表&#xff0c;但所有的班级最多选择5个 首先是嵌套表格 <div><el-table:data"tableDisplayData"id"chartTableExpand&q…

金融投资公司如何实现创新, 盛创汇凭借人工智能站上硬科技C位

作为硬科技产业的重要组成部分,近年人工智能受到了国家政策的高度重视。 在《 “十四五”规划和2035年远景目标纲要》中,人工智能被摆放在科技前沿领域攻关方面的首要位置,先后八次被提及。《规划》指出,对新一代人工智能,要在前沿基础理论突破,专用芯片研发,深度学习框架等开…

Nacos注册中心

Nacos 安装 https://nacos.io/zh-cn/ 源码安装 第一步&#xff1a;利用Gitee获取nacos在github上的代码到自己的gitee仓库中 https://github.com/alibaba/nacos.git 第二步&#xff1a;下载源码到本地。 第三步&#xff1a;使用maven编译代码。 # 先切换到master分支 gi…

ElasticSearch(ES)简单介绍

ES简介 Elasticsearch&#xff08;通常简称为ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;旨在处理各种类型的数据&#xff0c;包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的&#xff0c;但随着时间的推移&#xff0c;它已经演变成一个功能…

JUnit测试进阶(Private测试)

Private测试 前言一、间接调用二、Java反射机制调用 前言 在单元测试中&#xff0c;由于私有方法&#xff08;Private Method&#xff09;无法直接被调用&#xff0c;因此对私有方法进行测试成为一项难题。一个可行的方法是&#xff1a;在测试时将私有方法改变为公有方法&…

【记录】Truenas scale|Truenas 的 SSH 服务连不上 VScode,终端能连上

一般 Truenas连不上 就只有两种情况&#xff1a; 第一种&#xff1a;用户没对应用户目录。需要去用户管理里面对每个用户设置目录。 第二种情况&#xff0c;服务有个选项没勾选。这时会发现能输入密码但是一点反应都没有&#xff0c;打开details会看到报错channel 3: open fai…

nginx配置指南

nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件&#xff0c;该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织&#xff1a; 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…

Python 的运算符和语句(条件、循环、异常)基本使用指南

运算符的分类 算数运算符赋值运算符复合赋值运算符比较运算符逻辑运算符 算数运算符 运算符描述实例加1 1 输出结果为 2-减1 - 1 输出结果为 0*乘2 * 2 输出结果为 4/除10 / 2 输出结果为 5//整除9 // 4 输出结果为 2%取余9 % 4 输出结果为 1**指数2 ** 4 输出结果为 16&…