Java 数据结构,树的介绍

Java 数据结构:什么是树?怎么使用?

JavaCaiy

于 2020-12-06 19:41:50 发布

826

收藏 11

文章标签: 二叉树 队列 链表 数据结构 算法

版权

目录

一、树

1. 概述

2. 一些基本术语

二、二叉树

1. 概述

2. 重要特性

三、二叉树的存储结构

1. 顺序存储

2. 链式存储

四、二叉树的遍历

1. 由遍历序列确定二叉树

2. 根据遍历序列估计二叉树

3. 遍历和建树代码

一、树

1. 概述

与线性表表示的一一对应的线性关系不同,树表示的是更为复杂的数据元素之间的非线性关系。

直观来看,树是以分支关系定义的层次结构,是 一对多 的关系

树的定义:树 (Tree) 是 n( n>=0 ) 个结点的有限集合

有且仅有一个 根结点 (Root)

当n>1的时,其余结点可分为 m( m>0 ) 个互不相交的有限集T1,T2,…, Tm,其中每一个集合本身又是一棵树,并且称之为根的子树。

树的定义本身是一个递归定义,即在树的定义中又用到树的概念

2. 一些基本术语

树的结点:包含一个数据元素和若干指向其子树的分支

度(degree):结点拥有的子树的数目

度为** 0 的结点称为 叶子**,或** 终端结点**。度不为** 0** 的结点称为 非终端结点 或 分支节点

结点的子树的根,称为该结点的 孩子(child),相应的该结点称为孩子的 双亲(parent)

同一个双亲的孩子之间互称兄弟(sibling)

结点的 祖先 是从根到该结点所经分支上所有的结点。

以某结点为根的子树中的任意一结点都称为该结点的 子孙

结点的 层次(Level)从根开始定义,根为第一层,根的孩子为第二层,以此类推

树中结点的最大层次称为树的 深度(depth)或 高度

二、二叉树

1. 概述

定义:对一般的树加了约束:

每个结点最多两棵子树,即二叉树中不存在 度大于2 的结点

子树有 左右次序 之分

有 5 种形态:

满二叉树和完全二叉树(对满二叉树最底层,从右至左删除结点)

2. 重要特性

二叉树,在第 i 层至多有 2i-1 个结点

深度为 k 的二叉树至多有 2k-1 个结点

高度(或深度)为 K 的完全二叉树至少有 2k-2 个 叶子结点

非空二叉树的 叶子结点数 等于度为 2 的结点数加 1,即:n0 = n2 + 1

完全二叉树的 n1 只能是 0 或者 1

一颗度为 m 的二叉树,度为 1 的结点为 n1,度为 2 的结点为 n2,… …,度为 m 的结点数为 nm,则叶子结点数:n0**= 1 + n2****+ 2n3****+…+ (m-1)nm**

具有 n 个结点的完全二叉树,深度为 log2n + 1

编号性质:n 个结点的完全二叉树(其深度为 log2n + 1),对各结点从上到下,从左到右依次编号(1~n)则:若 i 是某结点 a 的编号:

如果 i 不等于 1,则 a 的双亲结点的编号为: ⌊ i/2 ⌋

如果 2i ≤ n, 则 a 的左孩子编号为 2i;如果** 2i > n**, 则 a** 无左孩子**;

如果** 2i + 1 ≤ n**, 则 a 的右孩子编号为** 2i + 1**;如果** 2i + 1> n**, 则 a** 无右孩子**;

三、二叉树的存储结构

1. 顺序存储

用 数组 来存储数据元素

从存储的角度来看,这种顺序存储结构,仅适用于 完全二叉树

因为在最坏的情况下,一个深度为 k 且只有 k 个结点的单支树( 树中不存在度为 2 的结点 ),却需要长度为 2k-1 的一维数组。

2. 链式存储

以 链表 的形式,存储数据元素以及数据元素之间的关系。

四、二叉树的遍历

1. 由遍历序列确定二叉树

由 先序和中序,可以确定

由 后序和中序,可以确定(但是注意后序最后一个为根,下一个是右子树根)

由 层次和中序,可以确定

2. 根据遍历序列估计二叉树

前序 遍历序列 和 后序 遍历序列 相同 的树:只有根结点

前序 遍历 和 中序 遍历 相同 的二叉树:所有结点没有左子树(右单分支树

中序 遍历 和 后序 遍历 相同 的二叉树:所有结点没有右子树(左单分支树)

前序遍历 和 后序 遍历 相反 的二叉树:没有左子树或者没有右子树(只有一个叶子结点)高度等于其结点数

前序 遍历 和 中序 遍历 相反 的二叉树:所有结点没有右子树(左单分支树)

中序 遍历 和 后序 遍历 相反 的二叉树:所有结点没有左子树(右单分支树)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
$(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、付费专栏及课程。

余额充值