树结构的自定义及基本算法(Java数据结构学习笔记)

2023-11-06

数据结构可以归类两大类型:线性结构与非线性结构,本文的内容关于非线性结构:的基本定义及相关算法。关于树的一些基本概念定义可参考:维基百科
树的ADT模型:
根据树的定义,每个节点的后代均构成一棵树树,称为子树。因此从数据类型来讲,树、子树、树节点是等同地位,可将其看作为一个节点,用通类:Tree表示。如下图所示:
这里写图片描述
图:Tree ADT模型示意图
可采用“父亲-儿子-兄弟”模型来表示树的ADT。如图所示,除数据项外,分别用三个引用表示指向该节点的父亲,儿子,兄弟。
这里写图片描述

图:“父亲-儿子-兄弟”模型的数据结构示意图

表:树ADT实现的操作
这里写图片描述

就对树的更新操作而言,不同的应用问题会要求树结构提供不同方法。这方面的差异太大,无法在树 ADT 中定义出通用的更新操作。在之后将结合各种应用问题,陆续给出一些具体的更新操作的实现。

树的java接口:

package com.tree;

/**
 * Java Structure for Tree
 * Construct interface Tree
 * @author gannyee
 *
 */
public interface Tree {
    //Get size of tree which recent node as parent
    public int getSize();

    //Get height of recent node
    public int getHeight();

    //Get depth of recent node
    public int getDepth();

    //Get element of recent node
    public Object getElement();

    //Set element of recent node, return former element
    public Object setElement(Object newElement);

    //Get parent of recent node
    public TreeLinkedList getParent();

    //Get first child of recent node
    public TreeLinkedList getFirstChild();

    //Get biggest sibling of recent node
    public TreeLinkedList getNextSibling();
}

Java代码:树节点模型实现

package com.tree;

import java.lang.reflect.Constructor;

public class TreeLinkedList implements Tree{
    //Pointer point to parent
    private TreeLinkedList parent;
    //Element
    private Object element;
    //Pointer point to firstChild
    private TreeLinkedList firstChild;
    //Pointer point to nextSibling
    private TreeLinkedList nextSibling;

    //Constructor
    public TreeLinkedList(){
        this(null,null,null,null);
    }

    //Constructor with parameters
    public TreeLinkedList(TreeLinkedList p, Object e,TreeLinkedList f,TreeLinkedList n){
        this.parent = p;
        this.element = e;
        this.firstChild = f;
        this.nextSibling = n;
    }
    //Get size of tree which recent node as parent
    public int getSize(){
        int size = 1; //Recent node also include own children
        TreeLinkedList subTree = firstChild;//Start with first child
        while(null != subTree){
            size += subTree.getSize(); 
            subTree = subTree.getNextSibling();//Get all descendants
        }
        return size;
    }

    //Get height of recent node
    public int getHeight(){
        int height = -1;//Recent node's(parent) height
        TreeLinkedList subTree = firstChild;//Start with first child

        while(null != subTree){
            height = Math.max(height, subTree.getHeight());//Get the max height
            subTree = subTree.getNextSibling();
        }
        return height + 1;//Get recent node height
    }

    //Get depth of recent node
    public int getDepth(){
        int depth = 0;
        TreeLinkedList p = parent;//Start with parent
        while(p != null){
            depth ++;
            p = p.getParent();//Get all parents of every node
        }
        return depth;
    }

    //Get element of recent node,if nothing return null
    public Object getElement(){
        return this.element;
    }

    //Set element of recent node,return former element
    public Object setElement(Object newElement){
        Object swap;
        swap = this.element;
        this.element = newElement;
        return this.element;
    }

    //Get parent of recent node,if nothing return null
    public TreeLinkedList getParent(){
        return parent;
    }

    //Get first child of recent node,if nothing return null
    public TreeLinkedList getFirstChild(){
        return firstChild;
    }

    //Get biggest sibling of recent node,if nothing return null
    public TreeLinkedList getNextSibling(){
        return nextSibling;
    }
}

测试代码:

package com.tree;

public class TreeTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        TreeLinkedList a = new TreeLinkedList();
        TreeLinkedList b = new TreeLinkedList();
        TreeLinkedList c = new TreeLinkedList();
        TreeLinkedList d = new TreeLinkedList();
        TreeLinkedList e = new TreeLinkedList();
        TreeLinkedList f = new TreeLinkedList();
        TreeLinkedList g = new TreeLinkedList();

        a = new TreeLinkedList(null,0,d,null);
        b = new TreeLinkedList(a,1,d,c.getFirstChild());
        c = new TreeLinkedList(a,2,null,null);
        d = new TreeLinkedList(b,3,f,e.getFirstChild());
        e = new TreeLinkedList(b,4,null,null);
        f = new TreeLinkedList(d,5,null,g.getFirstChild());
        g = new TreeLinkedList(d,6,null,null);

        System.out.println(a.getDepth());
        System.out.println(b.getDepth());
        System.out.println(c.getDepth());
        System.out.println(d.getDepth());
        System.out.println(e.getDepth());
        System.out.println(f.getDepth());

        System.out.println(a.getHeight());
        System.out.println(b.getHeight());
        System.out.println(c.getHeight());
        System.out.println(d.getHeight());
        System.out.println(e.getHeight());
        System.out.println(f.getHeight());
        System.out.println(g.getHeight());

    }

}

测试结果:

0
1
2
com.tree.TreeLinkedList@7c1c8c58
1
null
null

后续将给出关于树的遍历算法!

参考文献:数据结构与算法( Java 描述)邓俊辉 著

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树结构的自定义及基本算法(Java数据结构学习笔记) 的相关文章

  • 使用 global-method-security,访问被拒绝错误将作为 HTTP 500 错误返回

    我尝试使用 Spring Security Annotations 来确保安全 而不是在 XML 中定义规则 它似乎有效 但是当我遇到访问被拒绝错误时 我收到返回的 HTTP 状态代码 500 我在 tomcat 日志文件中没有看到任何异常
  • SpringBoot @SqsListener - 不工作 - 有异常 - TaskRejectedException

    我有一个 AWS SQS 队列中已有 5000 条消息 示例消息类似于 Hello 1 我创建了一个 SpringBoot 应用程序 并在其中一个组件类中创建了一个从 SQS 读取消息的方法 package com example aws
  • 在 JSF/JSP EL 和 Javascript 中连接字符串[重复]

    这个问题在这里已经有答案了 我在使用 EL 和 javascript 函数 JSF 1 2 Facelets Richfaces 3 3 0GA 时遇到问题 我有一个页面包含另一个组合
  • 在基于 RESTful 的应用程序中管理状态

    我们正在评估用于基于 Web 的应用程序的技术 一些建议是采用基于 RESTful 的服务方法 技术堆栈 1 春天 2 Apache CXF JAX RS 我的问题是 1 如何在请求之间管理状态 例如 用户已经过身份验证 现在他正在发出一系
  • 正则表达式删除2个字符串之间的所有内容

    我的replaceAll 需要一个正则表达式来删除2 个字符串和字符串本身之间的所有内容 例如 如果我有类似的东西 stackoverflow is really awesome nremove123 n I love it 我试图做一个像
  • spring roo vs appfuse 生成服务/dao 层

    我正在寻找有经验的用户对 spring roo 和 appfuse 的反馈 您认为逆向工程数据库表和生成服务层 dao 层和 jpa 实体哪一个更好 如果我没记错的话 spring roo 目前无法对数据库进行逆向工程 只是一个快速更新 通
  • 了解 Android 上的默认键盘

    我想知道 Android 中用户选择的默认键盘 我知道我可以使用以下命令访问启用的输入法列表InputMethodManager 但我想知道用户当前使用的是哪一个 到目前为止 我已经尝试获取当前的输入法子类型 InputMethodMana
  • Android MediaCodec 在异步模式下比同步模式下慢?

    再次 我有一个关于 Android 的 MediaCodec 类的问题 我已成功解码原始 h264 内容并将结果显示在两个纹理视图中 h264 流来自运行 openGL 场景的服务器 该场景有一个摄像头 因此可以响应用户输入 为了进一步减少
  • 在处理器生成的类中使用库

    我正在开发一个库来使用注释和处理器生成类 生成的类应该使用Gson来自谷歌的图书馆 我的问题是 我应该在哪里添加 Gson 依赖项 我目前正在将其添加到处理器 build gradle 中 但是当生成类时 找不到 Gson Android
  • CXFServlet 抛出 java.lang.NoSuchMethodError:

    java lang NoSuchMethodError org codehaus stax2 ri EmptyIterator getInstance Lorg codehaus stax2 ri EmptyIterator at com
  • Java + JNA:找不到指定的过程

    我正在尝试使用 Visual Studio 创建一个 dll 文件并在 java 项目中使用 访问它 该库似乎已加载 但总是抛出相同的异常 线程 main 中出现异常 java lang UnsatisfiedLinkError 查找函数
  • indexoutofboundException :setSpan (2...2) 结束长度超出长度 1

    I ve a MultiAutoCompleteTextView当用户按空格键时 我在其中创建芯片文本的自定义控件 我不希望用户在文本框为空时最初输入空格 所以我放了一个inputFilter以防止用户最初放置空格 这是过滤器代码 priv
  • 关于 servlet 的简要想法[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从哪里可以获得有关 servlet 的知识 大多数人会从 Sun 的有关 servlet 的官方教程开
  • Java Marine API - 寻找 NMEA 数据

    我的最终目标是从 Adafruit Ultimate GPS NMEA 0183 标准 接收纬度和经度 GPS 信息到我的 Java 应用程序 我正在使用 Java Marine API 来执行此操作 然后 当前位置将与时间戳一起写入数据库
  • Swing JTable:当行可见或滚动到底部时发生事件?

    我正在寻找一种方法 以便在 JTable 滚动时收到通知 以便特定行变得可见 或者在表底部滚动到视图中时失败 理想情况下 这应该在不轮询的情况下完成 而是通过一些事件触发来完成 有任何想法吗 Add a ChangeListener到滚动窗
  • java.lang.NullPointerException(无错误消息)APK构建

    Top level build file where you can add configuration options common to all sub projects modules buildscript repositories
  • Java 到 ruby​​ AES/ECB/PKCS5Padding 加密

    我有一个使用第三方支付门户的在线电子商务网站 支付门户一直运行良好 直到第三方支付门户要求每个人开始使用带有其他支付参数的哈希密钥 现在的问题是第三方支付门户只提供了一页文档来实现哈希密钥 这是提供的文档 加密演算法 为了减少数据传输和发布
  • 使用 Android API 发布推文

    我一直在寻找一种使用 Android 应用程序发布推文的方法 但我发现的所有方法都不起作用 我不得不承认 Twitter 的 API 并不是那么容易理解 但是我的代码并不长 而且我看不出我的错误在哪里 这是我的代码 public class
  • 总小时数无法从 Android 插入 MySQL

    我使用以下公式获得总小时数 public void updateTotalHours int a SplitTime objMyCustomBaseAdapter getFistTime int b SplitTime objMyCusto
  • Java 将函数添加到 json 对象而不使用引号。

    我正在用 java 构建一个 json 对象 我需要将一个函数传递到我的 javascript 中并使用 jquery isFunction 对其进行验证 我遇到的问题是我必须将 json 对象中的函数设置为字符串 但 json 对象将周围

随机推荐

  • tomcat线程池配置

    以Tomcat8为例 配置方式一
  • dependency-check-maven安全漏洞扫描工具介绍

    目录 dependency check maven安全漏洞扫描工具介绍 dependency check maven插件 重点参数解析 运行命令 检查单个maven工程安全漏洞 检查多个maven子工程汇总一个报告 命令行方式运行 扫描报告
  • 压缩感知(Compressed sensing)from wiki

    压缩感知 Compressed sensing 也被称为压缩采样 Compressive sampling 或稀疏采样 Sparse sampling 是一种寻找欠定线性系统的稀疏解的技术 压缩感知被应用于电子工程尤其是信号处理中 用于获取
  • Java继承和多态之接口

    Java继承和多态之接口 题目要求 仔细阅读右侧编辑区内给出的代码框架及注释 在 Begin End 中实现两个数的求和运算和比较 具体要求如下 编写程序 实现两个数的求和运算和比较 请在下面的Begin End之间按照注释中给出的提示编写
  • CVPR2021 视频目标检测——MM-DistillNet 基于多模态知识提取的自监督多目标检测与跟踪论文笔记/附原文和代码

    本文是CVPR2021最新的视频目标检测的论文 原文地址 https arxiv org abs 2103 01353v1 代码 https github com robot learning freiburg MM DistillNet
  • 028:vue上传解析excel文件,列表中输出内容

    第028个 查看专栏目录 VUE element UI 专栏目标 在vue和element UI联合技术栈的操控下 本专栏提供行之有效的源代码示例和信息点介绍 做到灵活运用 1 提供vue2的一些基本操作 安装 引用 模板使用 comput
  • python3 numpy详解

    基础操作 import numpy as np np创建数组 a np array 1 2 3 print a print type a a2 np array range 10 print a2 print type a2 numpy特有
  • DDoS攻击的三种类型

    如其名称所示 拒绝服务 DoS 攻击是为了使任何类型的服务无法访问 举例来说 关闭对外部在线资产如电子商务网站的访问构成拒绝服务 分布式拒绝服务 DDoS 的主要目的是防止服务被使用并被破坏 而不是试图破坏目标的安全范围 DDoS攻击针对服
  • Wix学习整理(6)——安装快捷方式

    一 为HelloWorld案例添加安装快捷方式 通常我们安装一个应用软件的时候 都喜欢在桌面或开始菜单中添加快捷方式以便我们快速访问 现在我们就在上篇添加注册信息的基础上为HelloWorld的安装包添加安装快捷方式 下面我们将以安装开始菜
  • SAP QM 执行事务代码QE01为检验批录入结果直接进入Multiple Specification标签页?

    SAP QM 执行事务代码QE01为检验批录入结果直接进入Multiple Specification标签页 1 检验批10000000509是采购订单收货后触发的检验批 执行事务代码QE01 为检验批10000000509录入检验结果 输
  • 【单片机毕业设计】【mcuclub-306】万年历电子时钟

    设计简介 项目名 基于单片机的万年历电子时钟的设计 基于单片机的多功能时钟的设计 基于单片机的数字时钟的设计 单片机 STC89C52 功能简介 1 通过DS1302实时获取时间 并掉电保存时间 2 通过DS18B20获取环境温度值 3 通
  • lodash的2个数组对象操作

    根据数组对象 下的属性名称 来返回相应 的值 数据格式如下 var data test1 test2 test3 test4 test5 var key test1 对象的每个属性名称不是相同的 对应的值 是一个数组 方法1 将data初始
  • C语言中的逻辑判断

    C语言中的逻辑判断 C语言中的逻辑判断是以真和假来表示的 0为假 一切非零为真 这里举几个例子 来让读者更加深入地了解判断语句 逻辑值 int a 5 int b 3 int c a gt b 我们来看c的结果 这时c 1 因为a gt b
  • android 9安装教程,android 9.x 实现应用内更新安装

    折腾了3天 总算解决了问题 依赖如下 implementation androidx core core 1 0 2 implementation com android support support compat 28 0 0 supp
  • 【题目】pyCharm 专业版 和 社区版的区别以及如何查看其版本

    时间 2018 09 22 题目 pyCharm 专业版 和 社区版的区别以及如何查看其版本 参考链接 https zhidao baidu com question 584331885111670725 html 一 pyCharm 专业
  • 用lld替代gld生成glibc

    用lld替代gld生成glibc 首先明确 lld是llvm中的链接器 要使用lld替代gld 则要先生成lld 然后再做个软链接使gnu找gld的时候找到的是lld 这样算是替代成功 其中会遇到很多问题 逐个击破最终成功使用lld生成gl
  • sqlserver的安装详解

    背景 最近课程需求 需要安装sqlserver 虽然网上有许多教程 但是自己去动手还是出现了许多问题 感觉网上教程不是很详细 所以将自己安装的经验写一个汇总 提供给大家共同学习 实验环境 win8 1 一 sqlserver2008R2的下
  • 从封装变化的角度看设计模式——对象创建

    封装变化之对象创建 在对象创建的过程中 经常会出现的一个问题就是通过显示地指定一个类来创建对象 从而导致紧耦合 这是因为创建对象时指定类名将使你受特定实现的约束而不是特定接口的约束 这会使未来的变化更加复杂 要避免这种情况 就应该间接地创建
  • 提取字符串单引号内的字符——Python for循环代码“异想天开”

    字符串处理 不用re模块 直接用for 手撕 字符串 提取单引号内字符串 本文获得CSDN质量评分 89 学习的细节是欢悦的历程 Python 官网 https www python org Free 大咖免费 圣经 教程 python 完
  • 树结构的自定义及基本算法(Java数据结构学习笔记)

    数据结构可以归类两大类型 线性结构与非线性结构 本文的内容关于非线性结构 树的基本定义及相关算法 关于树的一些基本概念定义可参考 维基百科 树的ADT模型 根据树的定义 每个节点的后代均构成一棵树树 称为子树 因此从数据类型来讲 树 子树