Java基础——核心类库之链表与二叉树

本文详细介绍了链表和二叉树这两种重要的数据结构。链表包括单链表、双向链表和循环链表,它们在内存中离散存储,插入删除操作相对快速。二叉树则是一种每个节点最多有两个子节点的数据结构,包括斜树、满二叉树和完全二叉树,具有特定的性质和遍历方式。链表与数组相比,虽存取速度较慢,但在动态变化的数据结构中更具优势;二叉树则在查找和组织数据上展现出高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表与二叉树

链表

1、什么是链表

链表是由一组不必相连(不必相连:可以连续也可以不连续)的内存结构(节点),按特定的顺序链接在一起的抽象数据类型。

2、链表与数组的区别和优缺点

数组链表
区别数组是一种连续存储性结构,元素类型相同,大小相等链表是离散存储线性结构
优点存取速度快①没有空间限限制②插入删除元素快
缺点①事先必须知道数组的长度②插入删除元素很慢③空间通常是有限制的④需要大块连续的内存块⑤插入删除元素的效率很低存取速度慢

3、链表的类别

(1)单链表

单链表由各个内存结构通过一个Next指针连接在一起组成,每一个内存结构都存在后继内存结构(链尾除外),内存结构由数据域和Next指针域组成。
在这里插入图片描述

(2)双向链表

由各个内存结构通过指针Next 和指针Prev 链接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构(链头没有前驱,链尾没有后继),内存结构由数据域、Prev 指针域和Next 指针域组成。 在这里插入图片描述

(3)循环链表
1)单向循环链表

单向循环链表由各个内存结构通过一个指针Next 链接在一起组成,每一个内存结构都存在后继内存结构,内存结构由数据域和Next 指针域组成。

2)双向循环链表

双向循环链表由各个内存结构通过指针Next 和指针Prev 链接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构,内存结构由数据域、Prev 指针域和Next 指针域组成。
在这里插入图片描述

二叉树

1、什么是二叉树

二叉树就是每个节点不能多于有两个儿子,即结点的度最大为2。
结点度:结点拥有的子树数。
而且还是一种特殊的二叉树:二叉查找树(当前根节点的左边全部比根节点小,当前根节点的右边全部比根节点大)。

2、二叉数的种类

(1)斜树

所有结点都只有左子树,或者右子树
在这里插入图片描述

(2)满二叉树

所有的分支结点都具有左右结点。

(3)完全二叉树

若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树。
在这里插入图片描述

3、性质

二叉树第i层上的结点数目最多为2^(i-1) (i≥1)
深度为h的二叉树至多有2^h-1个结点(h≥1)
包含n个结点的二叉树的高度至少为log2 (n+1)
在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1

4、遍历方式

二叉树的遍历方式分为广度遍历(按层遍历)和深度遍历。
二叉树的深度遍历方式,一般分为先序遍历,中序遍历,后序遍历。

  • 先序遍历
    o 先访问根节点,然后访问左节点,最后访问右节点(根->左->右)
  • 中序遍历
    o 先访问左节点,然后访问根节点,最后访问右节点(左->根->右)
  • 后序遍历
    o 先访问左节点,然后访问右节点,最后访问根节点(左->右->根)

先序遍历(根-左-右):1-2-4-8-9-5-10-3-6-7
中序遍历:(左-根-右):8-4-9-2-10-5-1-6-3-7
后序遍历(左-右-根):8-9-4-10-5-2-6-7-3-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;//真祖先的数目,即为当前节点的深度 } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值