数据结构与算法-树-二分搜索树(一)

二分搜索树

今天我们尝试构建一颗二分搜索树,很多同学只有理论,并没有对树有其编码实践。通过一步步的实现一颗二分搜索树,加深对数据结构树的理解。
二分搜索树,又名二分排序树,有人也叫它二分查找树。

特点

二分搜索树是二叉树, 每个节点的值大于所有左子树节点的值;小于所有右子树节点的值。

每一课子树都是二分搜索树。

image-20240316151544333

二分搜索树java实现

定义树中的节点
public class Node<E>{public  E data;public Node<E> left;public Node<E> right;public Node(E data) {this.data = data;}public E getData() {return data;}public void setData(E data) {this.data = data;}public Node<E> getLeft() {return left;}public void setLeft(Node<E> left) {this.left = left;}public Node<E> getRight() {return right;}public void setRight(Node<E> right) {this.right = right;}@Overridepublic String toString() {return "Node{" +"data=" + data +", left=" + left +", right=" + right +'}';}
}
构建树模型
第一种方式

使用递归的方式插入节点,构建二分搜索树模型

image-20240316171541090

public class BinaryTree<E extends Comparable<E>> {private int size; //定义树中的节点数量public Node<E> insert(Node<E> root, E data) {if (root == null) {root = new Node<>(data);size++;return root;}if (data.compareTo(root.data) < 0) {root.left = insert(root.left, data);}if (data.compareTo(root.data) > 0) {root.right = insert(root.right, data);}return root;}

测试程序

Node<Integer> root = new Node<>(35);BinaryTree<Integer> bst = new BinaryTree<>();
bst.insert(root, 32);
bst.insert(root, 12);
bst.insert(root, 55);
bst.insert(root, 10);
bst.insert(root, 77);
bst.insert(root, 11);
bst.insert(root, 6);
bst.insert(root, 72);
bst.insert(root, 53);new TreePrint<Integer>().print(root);

image-20240316171848641

第二种方式

使用循环的方式检查是否存在节点,如果没有节点则添加节点。

image-20240316172742426

public class BinaryTreex<E extends Comparable<E>> {private Node<E> root;public BinaryTreex(E data) {this.root = new Node<>(data);}public Node<E> getRoot(){return this.root;}public void insert(E data) {Node<E> currNode = root;while (currNode != null) {if (data.compareTo(currNode.data) > 0) {if (currNode.right == null) {currNode.right = new Node<>(data);return;}currNode = currNode.right;} else {if (currNode.left == null) {currNode.left = new Node<>(data);return;}currNode = currNode.left;}}}
}

运行结构

image-20240316172900786

附录:图形打印二叉树

参考引用来自:https://blog.csdn.net/m0_37550986/article/details/126013196。稍作修改

我们采用中序方式遍历所有节点,使用层序方式从上到下打印节点。

package com.ffyc.tree.bst;import java.util.*;/*** 中序图形效果打印** @param <E>*/
public class TreePrint<E> {private final List<Node<E>> mid = new ArrayList<>();//记录bst树的节点private final Map<Node<E>, Integer> map = new HashMap<>();//记录节点及位置private Queue<E> queue = new ArrayDeque<>();private Node<E> root;public TreePrint() {}public TreePrint(Node<E> root) {this.root = root;}/*** 中序遍历** @param root 树的根节点*/public void inOrder(Node<E> root) {if (root == null) {return;}inOrder(root.left);mid.add(root);inOrder(root.right);}/*** 使用Map记录节点及位置** @param root*/public void init(Node<E> root) {if (root == null) {return;}inOrder(root);for (int i = 0; i < mid.size(); i++) {map.put(mid.get(i), i);}}/*** 打印同一层的节点,使用|线和值进行拼接打印** @param nodes*/void printLevelNodes(List<Node<E>> nodes) {StringBuilder VLine = new StringBuilder();StringBuilder dataLine = new StringBuilder();StringBuilder line = new StringBuilder();int lastNodeIndex = 0;int lastRightIndex = 0;for (Node<E> node : nodes) {int x = map.get(node);String addEmpty = getEmpty(x - lastNodeIndex);lastNodeIndex = x;VLine.append(addEmpty).append("|");//竖线拼接dataLine.append(addEmpty).append(node.data); //值拼接Node<E> left = node.left;Node<E> right = node.right;String leftLine = null;String rightLine = null;int leftIndex = -1;int rightIndex = -1;if (left != null) {leftIndex = map.get(left);leftLine = getLineToChildren(x - leftIndex);}if (right != null) {rightIndex = map.get(right);rightLine = getLineToChildren(rightIndex - x);}String curLine = (leftLine == null ? "" : leftLine) + "|" + (rightLine == null ? "" : rightLine);if (leftLine == null && rightLine == null) curLine = "";//线段之间的间隔int dif = (leftIndex == -1 ? x : leftIndex) - lastRightIndex;String difEmpty = getEmpty(dif);line.append(difEmpty).append(curLine);//拼接线段lastRightIndex = rightIndex == -1 ? x : rightIndex;}System.out.println(VLine + "\n" + dataLine + "\n" + line);}String getEmpty(int x) {StringBuilder empty = new StringBuilder();for (int i = 0; i < x; i++) {empty.append("\t");}return empty.toString();}//链接子线段的长度String getLineToChildren(int end) {StringBuilder line = new StringBuilder();if (end == 0) return line.toString();for (int i = 0; i < end; i++) {line.append("____");}return line.toString();}/*** 扫描每一行中每一个节点的左右节点** @param lineNodes 每一行的节点*/public void topToDownLevelPrint(List<Node<E>> lineNodes) {if (lineNodes.isEmpty()) return;printLevelNodes(lineNodes);//打印同一层的节点List<Node<E>> children = new ArrayList<>();  //记录当前节点下的所有子节点//记录当前节点下的所有左右节点for (Node<E> currentNode : lineNodes) {if (currentNode.left != null) children.add(currentNode.left);if (currentNode.right != null) children.add(currentNode.right);}topToDownLevelPrint(children);//递归打印下一层节点}/***  调用此方法完成二分搜索树打印*  @param root : 根节点*/public void print(Node<E> root) {init(root);topToDownLevelPrint(new ArrayList<Node<E>>() {{add(root);}});}
}

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

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

相关文章

最强AI换脸工具Rope使用教程,Rope整合包下载【全网最全安装步骤】

Rope的汉化整合包&#xff08;包含模型&#xff09;以及下面教程所涉及到的所有安装包我都打包好了&#xff0c;需要的小伙伴可以关注文章底部公众号&#xff0c;回复关键词【rope】获取。 AI换脸软件简介必读 Rope 是一个免费开源的 AI 换脸软件&#xff0c;它具有图形化界面…

[ROS 系列学习教程] rosbag Python API

ROS 系列学习教程(总目录) 本文目录 1. 构造函数与关闭文件2. 属性值3. 写bag文件内容4. 读bag文件内容5. 将bag文件缓存写入磁盘6. 重建 bag 文件索引7. 获取bag文件的压缩信息8. 获取bag文件的消息数量9. 获取bag文件记录的起止时间10. 获取话题信息与消息类型 rosbag 的 Pyt…

如何创建用户流(User Flow):分步指南

原文作者&#xff1a;Camren Browne&#xff0c;CareerFoundry 翻译&#xff1a;数字营销工兵 (sources: 图片来源于网络&#xff09; 用户流(User Flow)是当今用户体验行业中最有用但被误解的工具之一。资深设计师经常避开它们&#xff0c;而初级设计师则很难抓住它们。 事…

炸裂!全球首个AI程序员!

近年来&#xff0c;人工智能&#xff08;AI&#xff09;在多个领域取得了显著进展&#xff0c;不断拓展其能力边界。一个引人注目的突破是全球首个AI程序员——Devin的诞生。 这一创新不仅展示了AI技术的快速进步&#xff0c;而且对软件开发领域和未来的工作场景产生了深远的影…

关于ffmpeg height not divisible by 2的错误

在我们线上视频生产过程中&#xff0c;我们用ffmpeg对视频做了resize&#xff0c;讲原有的分辨率resize到1280p&#xff0c;使用了参数 -vf "scale1280:-1"&#xff0c;作用是将原始视频宽度缩放成1280&#xff0c;-1是指高度等比例缩放。 之前一直运行的好好的&…

网络基础知识-操作系统作用+进程管理-嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记&#xff0c;未经本人许可&#xff0c;请勿转载&#xff0c;如发现本笔记内容的错误还望各位不吝赐教&#xff08;笔记内容可能有误怕产生错误引导&#xff09;。 本章的主要内容见下图&#xff1a; 本章知识和计算机…

Twitter代运营服务商哪家好?CloudNEO为您提供全链解决方案

在当今社交媒体盛行的时代&#xff0c;Twitter作为全球最知名的社交平台之一&#xff0c;已成为企业推广品牌、吸引客户和增加曝光的重要渠道。然而&#xff0c;如何有效地利用Twitter进行品牌推广和营销&#xff0c;成为许多企业面临的挑战。在这个背景下&#xff0c;选择一家…

HarmonyOS(鸿蒙)不再适合JS语言开发

ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以以更简洁、…

OpenvSwitch VXLAN 隧道实验

OpenvSwitch VXLAN 隧道实验 最近在了解 openstack 网络&#xff0c;下面基于ubuntu虚拟机安装OpenvSwitch&#xff0c;测试vxlan的基本配置。 节点信息&#xff1a; 主机名IP地址OS网卡node1192.168.95.11Ubuntu 22.04ens33node2192.168.95.12Ubuntu 22.04ens33 网卡信息&…

通过键盘对机械臂进行操作

1 #include<myhead.h>2 #include<linux/input.h>3 #define SER_PORT 88884 #define SER_IP "192.168.116.225"5 #define CLI_PORT 99996 #define CLI_IP "192.168.65.129"7 int main(int argc, const char *argv[])8 {9 //1、创建用于连接…

28.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据推测结果用提示框的形式显示

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;27.数据推测功能…

便利店小程序有哪些功能

​便利店小程序为附近的住户提供小程序在线购物的服务。用户只需要打开小程序&#xff0c;就可以购买需要的商品&#xff0c;可以选择自取或者配送。整个过程非常简单快速。下面具体介绍便利店小程序的功能。 1. **商品展示**&#xff1a;展示便利店的商品信息&#xff0c;包括…

贪心算法题解

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;这篇文章将给大家介绍贪心算法和贪心算法题目的练习和解析&#xff0c;贪心算法的本质就是每一个阶段都是局部最优&#xff0c;从而实现全局最优。我们在做题的同时&#xff0c;不仅要把题目做出来&#xff0c;还要有严格的证…

9 个顶级免费视频压缩软件精选

视频有多种格式、不同的大小和不同的压缩级别。但是&#xff0c;您可以使用最好的视频压缩器来&#xff1a; 减小文件大小提高压缩质量更好地服务您的观众 我们将列出九个领先的视频压缩软件精选&#xff0c;您今天可以免费使用它们来增强您的视频。 9 个顶级免费视频压缩器精…

【黑马程序员】Python综合案例

文章目录 数据分析案例目的需求数据准备实践数据记录类 文件解析解析csv格式解析json文件 进行数据计算读取文件数据按日期累加数据 图表展示图标绘制最终效果展示 数据分析案例 目的 文件操作实践json库使用三方库pyecharts使用面向对象实践数据容器使用 需求 给定一个csv…

设计模式之外观模式(Facade Pattern)【结构性模式】

为什么用结构性模式&#xff1f; 结构性模式关注点“怎样组合对象/类&#xff1f;”所以我们关注下类的组合关系类结构型模式关心类的组合&#xff0c;由多个类可以组合成一个更大的&#xff08;继承&#xff09;对象结构型模式关心类与对象的组合&#xff0c;通过关联关系在一…

Hadoop大数据应用:HDFS 集群节点缩容

目录 一、实验 1.环境 2.HDFS 集群节点缩容 二、问题 1.数据迁移有哪些状态 2.数据迁移失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署…

异常随笔xx1

关于过滤器和拦截器 看一下过滤器&#xff0c;过滤器我们可以分两步&#xff1a; 1.配置自定义过滤器 2.过滤器注册 这样它才会生效&#xff0c;拦截器也如此 先配置&#xff1a; RequiredArgsConstructor public class UserTransmitFilter implements Filter {private f…

裁员潮下,打工人的自我修养

法律规定的 裁员补偿&#xff1a; 1、平等协商解除的&#xff0c;底线是N1&#xff0c;上限能谈多少法律都支持 2、有客观原因解除的&#xff0c;是N1 3、强制违法辞退的&#xff0c;是2N Tips&#xff1a;基数是每月的全额税前工资&#xff0c;包括奖金绩效等&#xff0c…

strstr的模拟实现

一&#xff1a;strstr函数的定义&#xff1a; strstr函数功能的解释&#xff1a; 在一个字符串里面寻找另一个字符串的首次出现位置&#xff0c;返回值为该位置。 strstr函数要点&#xff1a; 1&#xff0c;如果 str2 是 str1 的一部分&#xff0c;它返回一个指向 str1 中 …