树形结构基本概念

树形结构是一种非线性的数据结构,形象地看像一棵倒置的树。每个节点可以有零个或多个子节点,根节点没有父节点,而叶子节点没有子节点。节点的度表示其子节点数量,树的度是所有节点中最大度的值。此外,节点间的关系如父节点、子节点、兄弟节点、堂兄弟节点等定义了树的结构。路径、层次和高度等概念则描述了节点间的连接和位置。树和森林是树形结构的不同形态,无序树与有序树则区分了子树的排列规则。

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

树形结构 

前面说过的数据结构都属于线性数据结构,也就是数据都是在同一个线性结构里面存储的。树形结构指的就是存储数据的结构为树形。类似于下面的图,因为看起来很像一颗倒着的树,所以称为树形结构。

基本概念:

树:由于上面的整个图行看起来就像一颗倒过来的树,所以上面的结构又称为树形结构。

节点:上面的树形结构是由若干个节点和节点之间连接的路径连起来构成的结构,ABCDEFG都是一个单独的节点。最上面的节点成为根节点。

父节点和子节点:上面的B节点就是D和E节点的父节点,D和E节点就是B节点的子节点。

节点的度:指的是当前节点的子节点的个数,比如上面B节点的度为2 F节点的度为0。

树的度:树的度指的是所有节点的最大的度的大小。

叶子节点:所有度为0的节点都成为叶子节点。只要树不是空树,就必然存在叶子节点。

分支节点:所有度不为0的节点成为分支节点,包括根节点在内的所有非叶子节点都是分支节点。

兄弟节点:拥有相同父节点的节点成为兄弟节点,比如B和C节点拥有相同的父节点A,所以两者称为兄弟节点。

堂兄弟节点:父节点拥有相同父节点的多个节点称为堂兄弟节点,比如D/F节点的父节点B/C拥有相同的父节点A,所以两个节点称为堂兄弟节点。

路径:从一个节点到另一个节点经过的路径。比如上面把ABD连起来就是路径。

节点的层次即深度:指的是从根节点到当前节点的路径的边的个数称为节点的层次或者深度。比如B节点的深度为1 D节点的深度为2

树的层次即深度:指的是最大的节点的深度。

节点的高度:节点的高度和深度的概念相反,是从下而上的。比如D节点的深度为0  A节点的深度为2

树的高度:指的是最大的节点的高度,跟深度的值相同。

祖先节点:指的是经过到当前节点的路径上面的其他节点,比如A、B是D节点的祖先节点。

子孙节点:指的是能够有路径到达的所有节点,比如上面除了A节点之外的其他节点都是A节点的子孙节点。一般如果之隔一代的也称为孩子节点。

子树根节点:以当前节点作为树的子树根节点。比如B节点就是A节点的子树根节点。

树和子树:以最上面的根节点作为根的整个树成为全树,以根节点的子节点作为根的节点成为子树。一个全树是由若干子树构成的。

森林:这个很好理解,就是多个没有联系的树构成了森林。加上一个统一的根,就成为了树,把根砍掉,就成为森林。

无序树:各个子树之间的顺序是没有要求的称为无序树。

有序树:各个子树之间的顺序是有要求的称为有序数。

 

 

$(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、付费专栏及课程。

余额充值