当前位置: 首页 > article >正文

Java数据结构6(队列和二叉树初步)

目录1队列的性质2循环队列3队列链式存储4树的性质5二叉树的遍历6代码实现一队列的性质同样是线性表队列有线性表的相关操作不过不同的是队列的性质为先进先出类似为排队一样队列的主要方法如下方法作用特点offer(E e)入队添加元素到队尾成功返回 true失败返回 false不抛异常poll()出队删除并返回队首元素队列为空时返回nullpeek()查看队首元素不删除队列为空时返回nulladd(E e)入队失败时直接抛出异常remove()出队队列为空时直接抛出异常QueueInteger queuenew ArrayDeque(); queue.offer(1); queue.offer(2); queue.offer(3); System.out.println(queue); queue.poll(); System.out.println(queue); System.out.println(queue.peek()); System.out.println(queue.isEmpty());二循环队列因为队列顺序存储存在不足当你出元素的时候是从头开始出你的头就会顺着延续给下一个元素头的指向就会不断往后走所以你前面的位置就空出来了会造成空间的浪费所以我们可以使用循环的方式来实现空间的利用类似这样的结构当我们删除元素的时候front往后走rear也往后走当我们加元素的时候front和rear都往前走当rear下下一个元素就是front的时候我们就放满了为什么这样就满了而不是放满呢因为当放满的时候rear就会和front重合但是当一个元素没有的时候rear和front也是重合的就不太好区分所以选择牺牲一个空间在代码的实现中有几个注意的点rear和front都是下标capacity是总长度比最多能放的元素多一1,队列满的条件是rear1%capacityfront也就是要rear的下一个元素是front因为小%大小所以1再%大就是rear1当这时候两者相等了就可以说明满了2rear1%capacity也是入队时的rear的循环语句3计算长度在计算长度的时候会出现以下两种情况第一种情况被分为了两部分一个1和一个4分别为rear11以及capacity-front6-2所以图一的个数为rear-frontcapacity图二就是rear-front5-0所以综合下来的公式就是rear-frontcapacity%capacity这样我们的代码就如下public class CircleQueue { private int arr[]; private int front; private int rear; private int capacity; public CircleQueue(int maxSize) { // maxSize为最多放的元素预留一个空闲元素所以1 capacity maxSize 1; arr new int[capacity]; front 0; rear 0; } public boolean isEmpty() { return front rear; } public boolean isFull() { return (rear 1) % capacity front; } //入队相当于offer public void enQueue(int val){ if (isFull()){ return; } arr[rear]val; rear(rear1)%capacity; } //出队相当于pop public void deQueue(){ if (isEmpty()){ throw new RuntimeException(队列为空); } front(front1)%capacity; } //拿头元素相当于peek public int getFront(){ if (isEmpty()){ throw new RuntimeException(队列为空); } return arr[front]; } //遍历 public void showQueue(){ if (isEmpty()) { System.out.println(队列为空); return; } // 从front开始遍历遍历有效元素个数 for (int i front; i ! rear; i (i 1) % capacity) { System.out.print(arr[i] ); } System.out.println(); } public static void main(String[] args) { CircleQueue circleQueuenew CircleQueue(5); circleQueue.enQueue(1); circleQueue.enQueue(2); circleQueue.enQueue(3); circleQueue.enQueue(4); circleQueue.enQueue(5); circleQueue.showQueue(); circleQueue.deQueue(); circleQueue.showQueue(); System.out.println(circleQueue.getFront()); } }三队列的链式存储因为上面的方法会牺牲一个空间并且规定了总空间不够灵活所以我们可以通过链式存储也就是简单的单项链表使用尾插法并且删除时候是删除前面以下是代码和我前面一篇自己实现单项链表的文章内容差不多public class Node { static class ListNode { public int val; public ListNode prev; public ListNode next; public ListNode(int val) { this.val val; } } public ListNode first; public ListNode last; //入队 public void offer(int val){ ListNode listNodenew ListNode(val); if (firstnull){ firstlastlistNode; } last.nextlistNode; listNode.prevlast; lastlistNode; } //获取头元素并且删除 public int poll(){ if (firstnull){ throw new RuntimeException(为空); } int val first.val; if (firstlast){ firstnull; lastnull; } firstfirst.next; first.prevnull; return val; } //获取头元素 public int peek(){ if (firstnull){ throw new RuntimeException(为空); } return first.val; } public int size(){ ListNode curfirst; int count0; while (cur!null){ curcur.next; count; } return count; } public boolean empty(){ return firstnull; } public void showQueue(Node node){ ListNode curfirst; while (cur!null){ System.out.print(cur.val ); curcur.next; } System.out.println(); } public static void main(String[] args) { Node nodenew Node(); node.offer(1); node.offer(2); node.offer(3); System.out.println(node.peek()); node.showQueue(node); node.poll(); node.showQueue(node); } }四树的相关性质1、树的定义树Tree是nn≥0个结点的有限集合满足若n0称为空树若n0有且仅有一个根结点其余结点可分为互不相交的有限集合每个集合本身又是一棵树称为根的子树。特点层次结构、一对多区别于线性表一对一、图多对多我们根据上图来引出相关定义结点的度一个结点含有子树的个数如上图A的度为3树的度一棵树中节点度的最大值如上图树的度为3叶子结点或终端结点度为0的结点称为叶结点双亲结点或父结点若一个结点含有子结点那么称为这个子结点的父结点根结点没有父结点的结点图中为A;结点的层次从根开始定义根为第一层根的子结点为第二层树的高度树中结点的最大层次图中为4非终端结点度不为0的结点二叉树1、基本定义特点每个节点最多有两个子节点分别叫左孩子、右孩子。子节点有左右次序不能随意互换是有序树。可以是空二叉树单个节点也是二叉树。2、特殊二叉树特点满二叉树每层节点都满所有叶子在最底层非叶子都有左右两个孩子。完全二叉树除最后一层外其余层节点全满最后一层节点靠左连续排列。叶子只出现在最下两层度为 1 的节点最多只有 1 个3、二叉树的性质1二叉树的第i层上至多有2^(i-1)个结点2如果有k层二叉树至多有2^k-1个结点3对于任何一颗二叉树如果终端结点树4为n0度为2的结点数为n2则n0n214具有n个结点的完全二叉树的深度为【log2n】15如果有n个结点的完全二叉树对任意结点i有1如果i1则结点i是二叉树的根如果i1则其双亲结点为i/22如果2in则结点i无左孩子否则其左孩子结点为2i3如果2i1n则结点i无右孩子否则其右孩子结点为2i1以这个完全二叉树为例上图为完全二叉树11是其根结点当i31的时候其双亲结点为3/212当i6的时候没有左孩子当i52i10不大于n左孩子结点为103当i5的时候没有右孩子当i3的时候右孩子为74、二叉树相关练习1.某⼆叉树共有 399 个结点其中有 199 个度为 2 的结点则该⼆叉树中的叶⼦结点数为 A 不存在这样的⼆叉树 B 200 C 198 D 1992.在具有 2n 个结点的完全⼆叉树中叶⼦结点个数为 A n B n1 C n-1 D n/23.⼀个具有767个节点的完全⼆叉树其叶⼦节点个数为A 383 B 384 C 385 D 3864.⼀棵完全⼆叉树的节点数为531个那么这棵树的⾼度为 A 11 B 10 C 8 D 12答案 1.B 2.A 3.B 4.B答题1根据性质3可知n0n21所以叶子结点也就是n0就等于200题2以上面图片的完全二叉树可以知道当总结点数为偶数的时候是有一个单独的左结点的也就是有一个单独的度为1的结点所以2n1n0n2然后又因为n0n21,所以n0n题3第3题也和第2题一样题4根据性质4可以计算出来并且深度是要取大的五二叉树的遍历1遍历方式二叉树的遍历主要是以前中后遍历主要是看根的位置在哪前序遍历根--左--右中序遍历左--根--右后序遍历左--右--根在我们从根或者左右到达一个新的结点的时候我们都要把它看成一个完整的二叉树来再看它的左右就如同递归一样我们还是以这一颗二叉树为例前序遍历1 → 2 → 4 → 8 → 9 → 5 → 10 → 3 → 6 → 7我们以前序遍历为例先是根1打印1然后遍历1的左边然后把左边看成新树以此类推打印2打印4打印8然后就是4的右边打印9打印5然后打印10再到1的右边打印3打印6最后打印72例题设⼀课⼆叉树的中序遍历序列badce后序遍历序列bdeca则⼆叉树前序遍历序列为()A: adbce B: decab C: debac D: abcde答根据后序遍历的特点可以知道根为a所以再根据中序遍历根在中间的特点所以b在a的左边dce在a的右边然后单独看后续遍历中的dec可以知道dec这颗完整的树中c是根d是左e是右最终会如下图六代码实现我们先纯手搓一个二叉树二叉树还是这个图中的代码如下public class BinaryTree { static class TreeNode{ public int val; public TreeNode left; public TreeNode right; public TreeNode(int val) { this.val val; } } public TreeNode CrateTree(){ TreeNode treeNode1new TreeNode(1); TreeNode treeNode2new TreeNode(2); TreeNode treeNode3new TreeNode(3); TreeNode treeNode4new TreeNode(4); TreeNode treeNode5new TreeNode(5); TreeNode treeNode6new TreeNode(6); TreeNode treeNode7new TreeNode(7); TreeNode treeNode8new TreeNode(8); TreeNode treeNode9new TreeNode(9); TreeNode treeNode10new TreeNode(10); treeNode1.lefttreeNode2; treeNode2.lefttreeNode4; treeNode4.lefttreeNode8; treeNode4.righttreeNode9; treeNode2.righttreeNode5; treeNode5.lefttreeNode10; treeNode1.righttreeNode3; treeNode3.lefttreeNode6; treeNode3.righttreeNode7; return treeNode1; }然后我们通过递归来实现前中后序遍历public void preorder(TreeNode root){ if (rootnull){ return; } System.out.print(root.val ); preorder(root.left); preorder(root.right); } //中 public void inorder(TreeNode root){ if (rootnull){ return; } inorder(root.left); System.out.print(root ); inorder(root.right); } public void postorder(TreeNode root){ if (rootnull){ return; } postorder(root.left); postorder(root.right); System.out.print(root ); }public class Test { public static void main(String[] args) { BinaryTree binaryTreenew BinaryTree(); BinaryTree.TreeNode ROOTbinaryTree.CrateTree(); binaryTree.preorder(ROOT); } }

相关文章:

Java数据结构6(队列和二叉树初步)

目录1,队列的性质2,循环队列3,队列链式存储4,树的性质5,二叉树的遍历6,代码实现一,队列的性质同样是线性表,队列有线性表的相关操作,不过不同的是队列的性质为先进先出&a…...

Pikachu 靶场 XSS 通关笔记:从反射型到盲打与过滤绕过

目录 一、基础 XSS 类型 1. 反射型 XSS (GET)2. 反射型 XSS (POST)3. 存储型 XSS4. DOM 型 XSS5. DOM 型 XSS-x 二、进阶 XSS 场景 6. XSS 之盲打 (Blind XSS)7. XSS 之过滤8. XSS 之 htmlspecialchars9. XSS 之 href 输出10. XSS 之 JS 输出 三、XSS 绕过速查表 四、Pikach…...

别再用Excel硬扛了!SPSS数据视图和变量视图保姆级上手指南

别再用Excel硬扛了!SPSS数据视图和变量视图保姆级上手指南 第一次打开SPSS时,很多从Excel转过来的用户会愣住——这个界面怎么既熟悉又陌生?左边明明也是表格,但为什么右键菜单里找不到"设置单元格格式"?右上…...

基于PSCAD的光伏-火电打捆直流送出系统建模与扰动特性仿真研究

基于PSCAD的光伏-火电打捆直流送出系统建模与扰动特性仿真研究 摘要 随着我国“双碳”目标的深入推进,以光伏为代表的新能源发电装机规模持续快速增长。然而,光伏发电具有间歇性和波动性特征,大规模并网对电力系统的安全稳定运行提出了严峻挑战。将光伏与火电打捆经高压直…...

C语言中的数据类型存储

1、二进制和进制转换我们经常能听到 2 进制、 8 进制、 10 进制、 16 进制 这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表⽰形式⽽已。⽐如:数值15的各种进制的表⽰形式(十六进制的数值之前写:0x &a…...

DAY 4.链表中环的入口节点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、链表中环的入口节点二、代码实现2.结论总结前言 一、链表中环的入口节点 思路:使用快慢指针,都从头节点出发,快指针一次…...

PX4 Firmware V1.14.4 开源支持

PX4 官方固件版本迭代迅猛,这往往导致开发者在硬件兼容性、环境搭建及软件依赖性上遭遇重重挑战。为彻底解决这一问题,Kerloud 推出固件与文档长期支持(LTS)计划。我们将对飞控固件代码、技术文档及参数调优指南实施持续性维护&am…...

渗透测试技巧(七)| 系统提权

系统提权基础 实战过程中,你通过漏洞(上传漏洞、弱口令、Web 漏洞)打进服务器,一般只能对应应用服务的账户权限。这个权限常常属于低权限账户,无法查看账号密码、配置系统文件、获取敏感数据等,这时就需要提权!提权就是把低权限账号升级为系统最高权限,从而完全控制服…...

SITS2026正式发布倒计时72小时:这4类AI研发团队已紧急升级知识治理体系,你还在用Wiki+钉钉硬扛?

更多请点击: https://intelliparadigm.com 第一章:AI研发知识管理:SITS2026专题 核心挑战与范式演进 AI研发正从单点模型训练转向全生命周期知识协同——SITS2026(Semantic Intelligence & Traceable Systems 2026&#xf…...

基于MCP协议的智能文档处理工具simdoc-mcp:从RAG原理到Claude集成实战

1. 项目概述:从“文档理解”到“智能交互”的范式跃迁最近在折腾一个挺有意思的开源项目,叫simdoc-mcp。乍一看这个名字,可能有点摸不着头脑,svd-ai-lab是背后的团队,simdoc是核心,mcp是关键协议。简单来说…...

Navicat Mac版无限重置试用期的终极指南:3种简单方法破解14天限制

Navicat Mac版无限重置试用期的终极指南:3种简单方法破解14天限制 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac …...

SharpKeys:免费Windows键盘重映射终极解决方案

SharpKeys:免费Windows键盘重映射终极解决方案 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys SharpKey…...

GodSVG:基于Godot引擎的结构化SVG编辑器,实现代码与图形双向实时同步

1. 项目概述:一个为开发者而生的结构化SVG编辑器 如果你和我一样,经常需要和SVG(可缩放矢量图形)打交道,无论是为网页设计图标、为游戏引擎制作矢量资源,还是进行数据可视化,那你一定体会过在传…...

AI编程新范式:基于.cursorrules的角色扮演开发环境实战指南

1. 项目概述:当AI助手有了“人设”,开发会变成一场情景喜剧吗?最近在折腾Cursor这个AI编程工具,发现了一个特别有意思的玩意儿:.cursorrules文件。简单来说,这玩意儿就像是你给Cursor这位“AI程序员”设定的…...

AI智能体如何通过区块链钱包实现自动化加密云存储

1. 项目概述:当AI智能体遇上加密云存储如果你正在使用OpenClaw这类AI智能体平台,并且头疼于如何让它们自动、安全地处理云端数据——比如备份对话记录、上传生成的文件,或者管理需要付费的API服务——那么你很可能需要一个既懂区块链支付、又…...

ACL 2026 | 未见伪造也能识别:「证链侦探」破解“泛化失灵”困局

AI 生成图像、AI 编造文本、图文协同伪造……今天的多模态虚假内容,已经越来越复杂。面对训练中没见过的新新闻域、新操纵方式、新组合套路,很多现有鉴伪模型往往就开始“掉链子”。问题的关键不只是伪造更多了,而是模型学到的东西太像“背答…...

GoAmzAI:开源AI工具箱如何自动化内容创作与分发工作流

1. 项目概述:一个面向内容创作者的AI驱动工具集最近在和一些做内容运营和自媒体的朋友聊天,发现大家普遍面临一个痛点:内容创作的效率瓶颈。无论是写一篇深度文章、策划一个视频脚本,还是管理多个平台的账号,从灵感到最…...

GoAmzAI:开源本地化部署,AI赋能亚马逊卖家高效生成运营文案

1. 项目概述:一个面向亚马逊卖家的AI助手最近在和一些做跨境电商的朋友聊天,发现他们每天花在亚马逊店铺运营上的时间,很大一部分都耗在了重复性的文案工作上。从产品标题、五点描述、A页面,到广告文案、客户邮件回复,…...

HelmWave实战:声明式编排Kubernetes多Chart部署与GitOps集成

1. 项目概述:HelmWave,一个被低估的Helm编排利器如果你和我一样,长期在Kubernetes环境中管理着几十甚至上百个Helm Chart,那你一定对“Helm依赖地狱”和“多环境部署同步”这两个词深有感触。每次更新,手动执行一堆hel…...

Godot 4写实水体渲染:从PBR原理到波浪、菲涅尔与焦散实战

1. 项目概述:从像素到波光,在Godot中实现写实水体渲染如果你正在用Godot引擎开发一款开放世界游戏、模拟经营类作品,或者只是想为你的独立游戏场景增添一抹灵动的色彩,那么一个逼真的水体系统往往是提升沉浸感的关键。然而&#x…...

精读双模态检测论文二十六|DefDeN(兰州大学)创新点拉满!门控融合+可变形去噪+对比学习,LiDAR-Camera 3D检测暴力涨点!!!

🔥 本文定位:CSDN 原创干货 | 兰州大学/卧龙岗大学 LiDAR-Camera 3D目标检测 SOTA 方案 🎯 核心收益:一次性解决注意力融合三大痛点——收敛慢、计算量大、误检率高!基于门控多模态融合单元(GMFU&#xff0…...

基于h2oGPT构建本地私有化知识库:从RAG原理到实战部署

1. 项目概述:一个真正私密的本地文档智能助手 如果你和我一样,对把敏感的工作文档、个人笔记或者内部资料上传到云端总有些提心吊胆,但又眼馋ChatGPT那种强大的文档理解和对话能力,那么h2oGPT的出现,可以说是解了我们…...

Godot 4中构建真实水体渲染:从PBR原理到性能优化实践

1. 项目概述:从像素到波光,在Godot中构建真实水体如果你正在用Godot引擎开发一款开放世界游戏、一个宁静的模拟场景,或者任何需要水体表现的项目,那么“水”的质量几乎直接决定了场景的沉浸感上限。静态的、像果冻一样的平面贴图早…...

前端工程化:持续集成实战指南

前端工程化:持续集成实战指南 前言 持续集成(CI)是现代软件开发的核心实践之一。它能帮助团队快速发现问题、减少集成风险、提高开发效率。今天我就来给大家讲讲如何搭建一套完整的前端持续集成流程。 什么是持续集成 持续集成是一种软件开发…...

前端工程化:代码审查最佳实践

前端工程化:代码审查最佳实践 前言 代码审查是保障代码质量的第一道防线。一个好的代码审查流程不仅能发现潜在的bug,还能促进团队知识共享,提升整体代码水平。今天我就来给大家讲讲如何建立一套高效的代码审查流程。 什么是代码审查 代码审查…...

前端工程化:依赖管理最佳实践

前端工程化:依赖管理最佳实践 前言 依赖管理是前端工程化的基础!如果你的项目依赖管理混乱,那你的项目就像一个堆满杂物的仓库,难以维护。今天我就来给大家讲讲前端依赖管理的最佳实践。 为什么需要依赖管理 版本控制:…...

AI助手配置同步工具:解决多工具MCP服务器与指令文件统一管理难题

1. 项目概述与核心痛点如果你和我一样,日常开发中同时使用多个AI编程助手——比如主力用Claude Code,但偶尔也会切到Gemini CLI、Codex CLI、Cursor、Kimi CLI这些工具,去蹭蹭它们的免费额度或者体验下不同的模型能力——那你一定深有体会&am…...

AI编码助手安全护栏:Claude代码生成规则引擎实战指南

1. 项目概述:为AI编码助手装上“护栏”最近在折腾AI辅助编程,特别是用Claude这类大模型来写代码,效率提升确实明显。但用久了就会发现一个问题:模型生成的代码,有时候会“放飞自我”。比如,它可能会引入一些…...

【2026实测】论文AI率居高不下?3大手改技巧与4款工具红黑榜

写文章现在最怕什么?查重?不,现在的风向变了——最怕的是AI率太高。 现在越来越多学校开始严查aigc报告,只要被判定AI率过重,直接打回重写甚至影响答辩资格。很多同学为了降低ai率,四处寻找各种免费降ai率…...

留学生避坑指南:我实测了4种方法,成功将英文论文AI率从97%降到8%

大家最近都在为英文降aigc率发愁吧,作为研三党,我太懂这种痛了,之前我自己写英文初稿,写完直接拿去查重,结果turnitin检测ai率飙到了89%,当时看着报告整个人都懵了。 怎么给英文降ai?对于非母语…...