树结构java_树结构与Java实现

本文介绍了树数据结构的基本概念,特点以及在计算机科学中的应用,如文件目录系统。通过Java实现了一个简单的树结构,包括节点操作、遍历和搜索功能,并通过示例展示了如何创建和遍历树。此外,文章还探讨了树结构在二叉树、TreeSet和TreeMap等数据结构中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

17d83d0983ae40a1213382f4b0db6b2e.png

目录

前言

提到『树』这种数据结构,相信很多人首先想到的就是『二叉树』。

的确,二叉树作为一种重要的数据结构,它结合了数组和链表的优点,有很多重要的应用。

我们都知道,数组的特点是查询迅速,根据index可以快速定位到一个元素。但是,如果要插入一个元素,就需要将这个元素位置之后的所有元素后移。平均来讲,一个长度为N的有序数组,插入元素要移动的元素个数为N/2。有序数组的插入的时间复杂度为O(N),删除操作的时间复杂度也为O(N)。

对于插入和删除操作频繁的数据,不建议采用有序数组。

链表的插入和删除效率都很高,只要改变一些值的引用就行了,时间复杂度为O(1)。但是链表的查询效率很低,每次都要从头开始找,依次访问链表的每个数据项。平均来说,要从一个有N个元素的链表查询一个元素,要遍历N/2个元素,时间复杂度为O(N)

对于查找频繁的数据,不建议使用链表。

本节先不介绍二叉树,而是先讲一下树这种数据结构。相信有了本节的知识作为基础,再了解二叉树就会轻松很多。

树的概念

1d7350f67c00bdead5bed9b6e4f36356.png

概述

在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。

它是由n(n>0)个有限节点组成一个具有层次关系的集合。

把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

它具有以下的特点:

每个节点都只有有限个子节点或无子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 树里面没有环路(cycle) —— 维基百科

根据树的定义,下面的结构就不是『树』:

e6131a41cdb41b0b6a94793f7d40c63e.png

术语

c4e01606f20f35eed41eb71110d23e43.png

路径

从某个节点依次到达另外一个节点所经过的所有节点,就是这两个节点之间的路径。

树顶端的节点被称为根。从根出发到达任意一个节点只有一条路径。

父节点

除了根节点之外,每个节点都可以向上找到一个唯一的节点,这个节点就是当前节点的父节点。相应的,父节点下方的就是子节点。

叶子节点

没有子节点的“光杆司令”就被称为叶子节点。

子树

每个子节点作为根节点的树都是一个子树。

一个树结构的代数就是这个树的层。

一棵树中,最大的节点的度称为树的度。

兄弟节点

具有相同父节点的节点互称为兄弟节点;

实际应用

树结构有非常广泛的应用,比如我们常用的文件目录系统,就是一个树结构。

例如在Windows10操作系统的CMD命令行输入tree命令,就可以输出目录树:

tree

卷 Windows 的文件夹 PATH 列表

卷序列号为 1CEB-7ABE

C:.

├─blog

│ ├─cache

│ │ └─JavaCacheGuidance

$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值