重温数据结构:树 及 Java 实现(转)

转自:http://blog.csdn.net/u011240877/article/details/53193877

读完本文你将了解到:

    • 什么是树
    • 树的相关术语
      • 根节点父亲节点孩子节点叶子节点如上所述
      • 节点的度
      • 树的度
      • 节点的层次
      • 树的高度
      • 树的深度
    • 树的两种实现
      • 数组表示
      • 链表表示的节点
    • 树的几种常见分类及使用场景

 

数据结构,指的是数据的存储形式,常见的有线性结构(数组、链表,队列、栈),还有非线性结构(树、图等)。

今天我们来学习下数据结构中的 

什么是树

线性结构中,一个节点至多只有一个头节点,至多只有一个尾节点,彼此连接起来是一条完整的线。

比如链表和数组:

shixin tai shuai le

而树,非线性结构的典型例子,不再是一对一,而变成了一对多(而图则可以是 多对多),如下图所示:

shixin tai shuai le

可以看到:

  • 图中的结构就像一棵倒过来的树,最顶部的节点就是“根节点 (root 节点)
  • 每棵树至多只有一个根节点
  • 根节点生出多个孩子节点,每个孩子节点只有一个父节点,每个孩子节点又生出多个孩子
  • 父亲节点 (parent) 和孩子节点 (child) 是相对的
  • 没有孩子节点的节点成为叶子节点 (leaf)

树的相关术语

根节点、父亲节点、孩子节点、叶子节点如上所述。

shixinzhang

节点的度

一个节点直接含有的子树个数,叫做节点的度。比如上图中的 3 的度是 2,10 的度是 1。

树的度

一棵树中 最大节点的度,即哪个节点的子节点最多,它的度就是 树的度。上图中树的度为 2 。

节点的层次

从根节点开始算起,根节点算第一层,往后底层。比如上图中,3 的层次是 2,4 的层次是 4。

树的高度

树的高度是从叶子节点开始,自底向上增加

树的深度

与高度相反,树的深度从根节点开始,自顶向下增加

整个树的高度、深度是一样的,但是中间节点的高度 和 深度是不同的,比如上图中的 6 ,高度是 2 ,深度是 3。

树的两种实现

从上述概念可以得知,树是一个递归的概念,从根节点开始,每个节点至多只有一个父节点,有多个子节点,每个子节点又是一棵树,以此递归。

树有两种实现方式:

  • 数组
  • 链表

数组表示:

我们可以利用每个节点至多只有一个父节点这个特点,使用 父节点表示法 来实现一个节点:

public class TreeNode {private Object mData;   //存储的数据private int mParent;   //父亲节点的下标public TreeNode(Object data, int parent) {mData = data;mParent = parent;}public Object getData() {return mData;}public void setData(Object data) {mData = data;}public int getParent() {return mParent;}public void setParent(int parent) {mParent = parent;}
}

  

上述代码中,使用 角标 来指明父亲节点的位置,使用这个节点组成的数组就可以表示一棵树。

public static void main(String[] args){TreeNode[] arrayTree = new TreeNode[10];
}

  

用数组实现的树表示下面的树,(其中一种 )结果就是这样的:

shixinzhang

shixinzhang

数组实现的树节点使用角标表示父亲的索引,下面用链表表示一个节点和一棵树:

链表表示的节点:

public class LinkedTreeNode {private Object mData;   //存储的数据private LinkedTreeNode mParent;   //父亲节点的下标private LinkedTreeNode mChild;  //孩子节点的引用public LinkedTreeNode(Object data, LinkedTreeNode parent) {mData = data;mParent = parent;}public Object getData() {return mData;}public void setData(Object data) {mData = data;}public Object getParent() {return mParent;}public void setParent(LinkedTreeNode parent) {mParent = parent;}public LinkedTreeNode getChild() {return mChild;}public void setChild(LinkedTreeNode child) {mChild = child;}}

  

使用引用,而不是索引表示父亲与孩子节点。

使用一个 List, 元素是 LinkedTreeNode,就可以表示一棵链表树:

public static void main(String[] args){LinkedList<LinkedTreeNode> linkedTree = new LinkedList<>();
}

  

这样只需知道 根节点就可以遍历整个树。知道某个节点也可以获取它的父亲和孩子。

树的几种常见分类及使用场景

树,为了更好的查找性能而生。

常见的树有以下几种分类:

  • 二叉树
  • 平衡二叉树
  • B 树
  • B+ 树
  • 哈夫曼树
  • 红黑树

接下来陆续介绍完回来补使用场景。

转载于:https://www.cnblogs.com/SimonHu1993/p/7661671.html

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

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

相关文章

Powershell检测AD账户密码过期时间并邮件通知

脚本主要实现了两个功能 &#xff1a; 一能判断账户密码的过期时间并通过邮件通知到账户&#xff1b; 二是将这些即将过期的账户信息累计通知到管理员。 脚本如下&#xff1a; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051…

js list删除指定元素_vue.js

vue.js 中M V MV代表哪一部分 <插值表达式&#xff08;v-cloak v-text v-html v-bind&#xff08;缩写是:&#xff09; v-on&#xff08;缩写是&#xff09; v-model v-for v-if v-show &#xff09;<body><div id"app"><!-- 使用 v-cloak 能够解决…

修改db2管理服务器,创建DB2管理服务器的两种情况

DB2管理服务器在创建时分为创建一个和创建多个两种情况&#xff0c;下面就为您详细介绍这两种创建DB2管理服务器的情况&#xff0c;供您参考学习。一、创建DB2管理服务器(只能创建一个)1、首先创建管理服务组用户(可不建)命令&#xff1a;sudo groupadd dasadm12、创建用户命令…

系统程序员成长计划-走近专业程序员

转载时请注明出处和作者联系方式 文章出处&#xff1a;http://www.limodev.cn/blog 作者联系方式&#xff1a;李先静 <xianjimli at hotmail dot com> 需求简述 用C语言编写一个双向链表。如果你有一定的C语言编程经验&#xff0c;这自然是小菜一碟。有的读者可能连一个…

Python 内置模块之 asyncio(异步iO)

python3.0&#xff0c;标准库里的异步网络模块&#xff1a;select(非常底层) &#xff0c;第三方异步网络库&#xff1a;Tornado&#xff0c;gevent python3.4&#xff0c;asyncio&#xff1a;支持 TCP &#xff0c;子进程 现在的asyncio&#xff0c;有了很多的模块已经在支持…

前端js文件合并三种方式

最近在思考前端js文件该如何合并&#xff0c;当然不包括不能合并文件&#xff0c;而是我们能合并的文件&#xff0c;想了想应该也只有三种方式。 三个方式如下&#xff1a; 1. 一个大文件&#xff0c;所有js合并成一个大文件&#xff0c;所有页面都引用它。 2. 各个页面大文件&…

我们的系统检测到您的计算机网络中存在异常流量_如何建立我们的网络防线?入侵检测,确保我们的网络安全...

目前我们的网络安全趋势日益严峻&#xff0c;那么如何利用入侵检测系统确保我的网络安全呢&#xff1f;入侵检测又是什么呢&#xff1f;网络安全入侵检测技术是为保证计算机系统的安全&#xff0c;而设计与配置的一种能够及时发现并报告系统中未授权或异常现象的技术&#xff0…

sql修改链接服务器名称,SQL Server 创建链接服务器的脚本,自定义链路服务器的简短名称...

USE [master]GO/****** Object: LinkedServer [SQL01] Script Date: 2020/4/9 11:51:17 ******/EXEC master.dbo.sp_addlinkedserver server N‘SQL01‘, srvproductN‘‘, providerN‘SQLNCLI‘, datasrcN‘域名或者IP‘/* For security reasons the linked server remot…

mybatis $和#源代码分析

JDBC中&#xff0c;主要使用两种语句&#xff0c;一种是支持参数化和预编译的PreparedStatement,支持原生sql,支持设置占位符&#xff0c;参数化输入的参数&#xff0c;防止sql注入攻击&#xff0c;在mybatis的mapper配置文件中&#xff0c;我们通过使用#和$告诉mybatis我们需要…

git 命令详解和常见问题解决

功能一 提交&#xff1a;1:git init # 初始化&#xff0c;表示即将对当前文件夹进行版本控制2:git status # 查看Git当前状态&#xff0c;如&#xff1a;那些文件被修改过、那些文件还未提交到版本库等。3:git add . # 添加当前目录下所有文件到版本…

辞职日记----记录31岁的程序员跳槽心态

vcleaner http://topic.csdn.net/u/20080626/23/8f6a8ecc-c072-43ee-bf2d-7ac2286b6805.html http://topic.csdn.net/u/20080704/23/858fc00d-ec14-4db7-93be-34903b7f157a.html 转载他的离职日记&#xff0c;有许多东西值得我们认真思考&#xff0c;人活着到底为了什么&a…

从Android源码的角度分析Binder机制

IPC 为了弄懂IPC的来龙去脉&#xff0c;我将从以下三个方面为大家来讲解&#xff0c;希望对大家理解IPC会有帮助 什么是IPC IPC是Inter Process Communication的缩写&#xff0c;其意思就是进程间的通信&#xff0c;也就是两个进程之间的通信过程。我们都知道在Android系统中&a…

excel vba 调用webbrowser_VBA 公式与函数

一, 在单元格中输入公式的3种方法:1) 用VBA在单元格中输入普通公式Sub formula_1() Range("d2") ("B2 * C2") End Sub运行程序后,在D2的单元格内显示的是公式 B2 * C2 ,并非程序返回值.下文(二)中会介绍另外一种直接返回值的方式想要通过程序一…

内部类可以引用它的包含类的成员吗?有没有什么限制?

最近看到一道面试题&#xff1a;内部类可以引用它的包含类的成员吗&#xff1f;有没有什么限制&#xff1f; 答案大部分都是这样子的&#xff1a; 完全可以。如果不是静态内部类&#xff0c;那没有什么限制&#xff01; 一个内部类对象可以访问创建它的外部类对象的成员包括私有…

松下NPM服务器怎么备份系统,松下(Panasonic)-NPM校正amp;CPK完整版教程,一步步带你成为SMT设备大神!...

马上注册&#xff0c;结交更多技术专家&#xff0c;享用更多功能&#xff0c;让你轻松解决各种三星贴片机问题您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;立即注册 xa8f80375060fa05b8aebe69ffa21080c.gif (5.26 KB, 下载次数: 3)2019-8-12 00:02 上传f5aae…

Python 模块之科学计算 Pandas

目录 一、Pandas简介 数据结构 二、Series series 的创建 Series值的获取 Series的运算 Series缺失值检测 Series自动对齐 Series及其索引的name属性 三、DataFrame 创建 Index对象 通过索引值或索引标签获取数据 自动化对齐 四、文件操作 文件读取 数据库数据…

根据 设备名(br0/eth0/em0)称获取 当前机器的IP地址与子网掩码信息

#!/usr/bin/env python 根据 设备名(br0/eth0/em0)称获取 当前机器的IP地址与子网掩码信息import socket, struct, fcntldef get_ipaddress(ifname eth0):s socket.socket(socket.AF_INET, socket.SOCK_DGRAM)return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915, # SI…

我的程序生涯

本文仅为爱好程序及向往真正之程序员者所作&#xff0c;其余人等可忽略下文。 如今&#xff0c;接触CS几近八年&#xff0c;不学无术&#xff0c;所精之物鲜也&#xff0c;以至一事无成。 现回忆吾程序之生涯&#xff0c;以整理繁杂之心绪。 1. 接触计算机和编程语言 02年始大…

机器学习中qa测试_如何对机器学习做单元测试

作者&#xff1a;Chase Roberts编译&#xff1a;ronghuaiyang导读养成良好的单元测试的习惯&#xff0c;真的是受益终身的&#xff0c;特别是机器学习代码&#xff0c;有些bug真不是看看就能看出来的。在过去的一年里&#xff0c;我把大部分的工作时间都花在了深度学习研究和实…

项目宝提供的服务器,开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布

开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布更新的功能列表如下&#xff1a;1.解决开启广播消息开关时&#xff0c;不能同时接入2个客户端的重大缺陷。2.对广播消息做了重大优化&#xff0c;从以前一个线程发送广播消息进化到使用工作线程池中的线程并行的发…