Java数据结构(数据、链表、树)

Java数据结构

一、数组

定义:数组是用于储存多个相同类型数据的集合,是有序的元素序列。

结构:

在这里插入图片描述

代码:

char ch[]=new char[5];
ch[0]='1';
ch[1]='2';
char ch[]=new char[]{'1','2','3','4','5'};

特点:

数组就是在内存中开辟一块连续的、大小相同的空间,用来存储数据.

可以通过下标访问的方式访问成员,查询效率高

增删操作会给系统带来性能消耗[保证数据下标越界的问题,需要动态扩容]

二、链表

定义:链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的,每一个链表都包含多个节点,节点又包含两个部分,一个是数据域(储存节点含有的信息)

​ 分为单向链表和双向链表

双向链表结构:

添加:添加时只需要修改指针的指向地址就可以,无需要像数组那样开辟新的内存空间

C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200922112104604.png)]

删除:删除时同样修改指针的指向地址就可以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oeq2Idid-1605233527435)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200922112138177.png)]

特点:

灵活的空间要求,存储空间不要求连续

不支持下标的访问.支持顺序的遍历搜索

针对增删操作找到对应的节点改变链表的头尾指向即可,无需移动元素存储位置

三、树

定义:一棵树(tree)是由n(n>0)个元素组成的有限集合

每个元素称为结点(node);

有一个特定的结点,称为根结点或根(root);

除根结点外,其余结点被分成m(m>=0)个互不相交的有限集合,而每个子集又都是一棵树(称为原树的子树)

学习树的网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

1.二叉树

定义:二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。

结构:

在这里插入图片描述

特点:

某节点的左子树节点值仅包含小于该节点值
某节点的右子树节点值仅包含大于该节点值
左右子树每个也必须是二叉查找树
顺序排列

2.不平衡二叉树

结构:

在这里插入图片描述

特点:

当数据都小于或者大于根节点时,查询效率不高

3.平衡二叉树(AVL树)

定义:平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1,常见的符合平衡树的有,B树(多路平衡搜索树)、AVL树(二叉平衡搜索树)等。

特点:

左右两子树的高度差的绝对值不能超过1

左右两子树也是一颗平衡二叉树

如图所示,左图是一棵平衡二叉树,根节点10,左右两子树的高度差是1,而右图,虽然根节点左右两子树高度差是0,但是右子树15的左右子树高度差为2,不符合定义,所以右图不是一棵平衡二叉树。

在这里插入图片描述

由此看出:平衡二叉树是一棵高度平衡的树,为了维系一棵平衡二叉树树要作的工作比普通的二叉树要复杂的多,每当有新的节点插入时,检查是否插入后会破坏平衡,如果是那么需要旋转去改变树的结构,使他成为一棵平衡的二叉树

4.红黑树

定义:红黑树Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树上的每个节点都遵循下面的规则:

每个节点要么是黑色,要么是红色。
根节点是黑色。
每个叶子节点(NIL)是黑色。
每个红色结点的两个子结点一定都是黑色。
任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

红黑树能自平衡,它靠的是什么?三种操作:左旋、右旋和变色

左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,
右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。

右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,
左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
变色:结点的颜色由红变黑或由黑变红。

红黑树插入场景

红黑树为空时:直接插入并把节点变成黑色

插入节点的父节点为黑色:直接插入

插入节点的父节点为红节点

点),其左子结点变为旋转结点的父结点,

左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
变色:结点的颜色由红变黑或由黑变红。

红黑树插入场景

红黑树为空时:直接插入并把节点变成黑色

插入节点的父节点为黑色:直接插入

插入节点的父节点为红节点:如下图

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
/* * 基于链表实现结构 */ package dsa; public class TreeLinkedList implements Tree { private Object element;//根节点 private TreeLinkedList parent, firstChild, nextSibling;//父亲、长子及最大的弟弟 //(单节点)构造方法 public TreeLinkedList() { this(null, null, null, null); } //构造方法 public TreeLinkedList(Object e, TreeLinkedList p, TreeLinkedList c, TreeLinkedList s) { element = e; parent = p; firstChild = c; nextSibling = s; } /*---------- Tree接口中各方法的实现 ----------*/ //返回当前节点中存放的对象 public Object getElem() { return element; } //将对象obj存入当前节点,并返回此前的内容 public Object setElem(Object obj) { Object bak = element; element = obj; return bak; } //返回当前节点的父节点;对于根节点,返回null public TreeLinkedList getParent() { return parent; } //返回当前节点的长子;若没有孩子,则返回null public TreeLinkedList getFirstChild() { return firstChild; } //返回当前节点的最大弟弟;若没有弟弟,则返回null public TreeLinkedList getNextSibling() { return nextSibling; } //返回当前节点后代元素的数目,即以当前节点为根的子的规模 public int getSize() { int size = 1;//当前节点也是自己的后代 TreeLinkedList subtree = firstChild;//从长子开始 while (null != subtree) {//依次 size += subtree.getSize();//累加 subtree = subtree.getNextSibling();//所有孩子的后代数目 } return size;//即可得到当前节点的后代总数 } //返回当前节点的高度 public int getHeight() { int height = -1; TreeLinkedList subtree = firstChild;//从长子开始 while (null != subtree) {//依次 height = Math.max(height, subtree.getHeight());//在所有孩子中取最大高度 subtree = subtree.getNextSibling(); } return height+1;//即可得到当前节点的高度 } //返回当前节点的深度 public int getDepth() { int depth = 0; TreeLinkedList p = parent;//从父亲开始 while (null != p) {//依次 depth++; p = p.getParent();//访问各个真祖先 } return depth;//真祖先的数目,即为当前节点的深度 } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值