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

数据结构可以归类两大类型:线性结构与非线性结构,本文的内容关于非线性结构:的基本定义及相关算法。关于树的一些基本概念定义可参考:维基百科

树的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 描述)邓俊辉 著

版权声明:本文为博主原创文章,未经博主允许不得转载。个人github代码空间:https://github.com/gannyee

时间: 2024-11-01 06:51:14

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

【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

  本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型   队列同样是一种特殊的线性表,其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out).我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列

【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关系 图形结构或网状结构:数据元素之间存在多个对多个的关系 对于数据不同的逻辑结构,计算机在物理磁盘上通常有两种屋里存储结构 顺序存储结构 链式存储结构 本篇博文主要讲的是线性结构,而线性结构主要是线性表,非线性结构主要是树和图. 线性表的基本特征: 总存在唯一的第一个数据元素 总存在唯一的最后一个数据元素 除

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

java数据结构学习(一)之二分查找

  二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了.为了能用最少的次数猜中,必须从50开始猜,如果她说你猜的太小,则推出那个数在51-100之间,所以下一次猜75((51+100)/2),如果她说有些大,那你就会在51-74之间才,下一次猜(51+74)/2=62.直到猜中她所给的数. 下面给出我们猜1-100的数,key为33的过程: 只需7次就可以猜中答案.下面

Java数据结构学习—Collections类

java.util 类 Collections java.lang.Object java.util.Collections public class Collections extends Object 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成.它包含在 collection 上操作的多态算法,即"包装器",包装器返回由指定 collection 支持的新 collection,以及少数其他内容. 如果为此类的方法所提供的 colle

Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. 2.下面我们是自定义一个SmartImageView继承自ImageView,扩展了ImageView的功能:     步骤: • 新建一个SmartImageView类,让继承自ImageView(放置特定的包下): • 实现SmartImageView类下的构造方法,最好全部实现,这个不容易出

数据结构学习笔记(1)-数据结构与算法

基本概念和术语 1.数据  数据元素  数据对象   数据结构 数据:在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象:是性质相同的数据元素的集合.是数据的一个子集. 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 2.数据结构 数据结构分为逻辑结构和物理结构 2.1逻辑结构 逻辑结构表示数据之间的相互关系.通常有四种基本结构: 集合:结构中的数据元素除了同属于一种类型外,别

java数据结构学习之—Collection接口

Collection接口代表一组对象,这组对象称为它的元素,有些实现(如链表)是无序的,有些实现(集合和映射)是有序的,有些实现是允许重复的,而有些实现不允许重复,从java5开始,Collection接口和整个集合类API都使用泛型,所有容器都支持一下操作: 1.boolean isEmpty() 如果容器不包含任何元素,则返回true,否则返回false. 2.int size() 返回容器中元素的个数 3.boolean add(AnyType x) 将项X添加到容器中,如果操作成功,则返

Java数据结构学习—Iterator接口

迭代器是一个对象,它能是我们迭代集合中的所以元素 在Java集合类API中,Iterator接口很小,只包含三个方法: 1.boolean hasNext() 如果在这次迭代中还有迭代浏览的的项,则返回true. 2.AnyType next() 返回这个迭代器还未看到的对下一个对象的引用,对象变为可见,则迭代器后移. 3.void remove() 三次浏览的最后一个项,在对next的调用之前,只能用一次这种方法. 每个集合都定义了自己的Iterator接口的实现,对java.util包中的