20220805 第五组 罗大禹 学习笔记
20220805 第五小组 罗大禹 学习笔记
Java 数据结构——树
学习重点
1.树
学习内容
Java 数据结构——树
树
前提知识:数据结构——树
树(Tree):是n(n>=0)个结点的有限集,n=0,称为空树。
结点:结点是数据结构中的基础,构成复杂数据结构基本组成单位
在任意的非空树中:
有且仅有一个特定的称为根结点
当n>1时,其余结点可分为m个互不相交的有限集
定义树时:
-
根节点是唯一的,不能存在多个根节点
-
子树的个数没有限制,但他们一定是互不相交的
树的定义中,使用了递归的方式。递归在树的学习过程中起着重要的作用。
结点的度:
结点拥有子节点的数量称为结点的度。
结点关系:
结点子树的根节点称为该节点的孩子结点。
相应该节点称为孩子结点的父节点(双亲结点)。
结点层次:
结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第1层,则其子树的根就在第1+1层。其双亲在同一一层的结点互为堂兄弟。
树的深度:
树中结点的最大层数称为树的深度或高度。
二叉树:
二叉树是n个结点的有限集合,如果n=0,那就称为空二叉树。
二叉树的特点:
-
每个结点最多只有两颗子树,所以二叉树中不存在度大于2的结点
-
左子树和右子树是有顺序的,次序不能任意颠倒
-
即使树中某个结点只有一颗子树,也要区分它是左子树还是右子树
二叉树的性质:
-
在二叉树中第i层上最多有2^(i-1)个结点(i>=1)
-
二叉树中如果深度为k,那么最多有2^k-1个结点。
-
n0=n2+1,n0表示度数为0的结点,n2表示度数为2的结点数
-
在完全二叉树中,,具有n个结点的完全二叉树的深度为[(log2)n] +1,其中[(log2)n]是向下取整
-
若对含n个结点的完全二叉树从上到下且从左到右进行1至n的编号,则对完全二叉树中任意一个编号为i的结点有如下特性:
- 若i=1,则该结点是二叉树的根,无父节点,否则,编号为i/2的结点为其父节点
- 若2i>n,则该结点无左孩子结点,否则,编号为2i的结点为其左孩子结点
- 若2i+1>n,则该结点无右孩子结点,否则,编号为2i+1的结点为右孩子结点
斜树:
所有的结点都只有左子树的二叉树叫做左斜树。所有结点都是只有右子树的二叉树叫右斜树。
满二叉树:
在一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有的叶子都在同一层上,
这样的二叉树叫做满二叉树。
满二叉树的特点:
-
叶子只能出现在下一层。
-
非叶子结点的度一定是2
-
在同样深度的二叉树中,满二叉树的结点个数最多,叶子数也最多。
完全二叉树:
对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点位置完全相同。这颗二叉树就称为完全二叉树。
二叉树的存储结构:
-
顺序存储
使用一维数组存储二叉树中的结点,并且结点的存储位置,就是数组的下标索引。当二叉树为完全二叉树时,结点数刚好填满数组。如果二叉树不是完全二叉树,采用顺序存储,顺序存储结构中已经出现了空间浪费的情况。比如右斜树极端情况,采用顺序存储的方式是十分浪费空间。顺序存储只适用于完全二叉树。
-
二叉链表
顺序存储不能满足二叉树的存储要求,采用链式存储。二叉树的每个结点都有两个孩子。可以将结点数据结构定义成一个数据和两个指针域。
二叉树遍历:(重点考察)
二叉树的遍历从根节点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次,且仅被访问一次。
前序遍历
从二叉树的根结点出发,按照先向左再向右的方向访问。(根左右)
后序遍历
从二叉树的根结点出发,先向左再向右的方向访问。(左右根)
中序遍历
从二叉树的根结点出发,按照先向左再向右访问。(左根右)
层次遍历
按照树的层次自上而下的遍历二叉树。ABCDEFGHIJ
举例说明:
class TreeNode<T> {
T data; // 数据本身
TreeNode left; // 左孩子
TreeNode right; // 右孩子
public TreeNode(T data) {
this.data = data;
}
// 前序遍历
// 传入的参数就是根节点
public static void preorder(TreeNode root){
if(root == null){
return;
}
System.out.println(root.data);
// 递归
preorder(root.left);
preorder(root.right);
}
// 中序遍历
public static void inorder(TreeNode root) {
if(root == null){
return;
}
inorder(root.left);
System.out.println(root.data);
inorder(root.right);
}
// 后序
public static void postorder(TreeNode root){
if(root == null){
return;
}
postorder(root.left);
postorder(root.right);
System.out.println(root.data);
}
}
public class Ch01 {
public static void main(String[] args) {
TreeNode<Integer> root = new TreeNode<>(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(7);
// 前序遍历
System.out.println("----------前序遍历--------------");
TreeNode.preorder(root);
System.out.println("----------中序遍历--------------");
TreeNode.inorder(root);
System.out.println("----------后序遍历--------------");
TreeNode.postorder(root);
}
}
其他的树分类:
1.二叉查找树(二叉搜索树。二叉排序树)
- 若左子树不为空,左子树的所有的值小于它的根节点的值
- 若右子树不为空,右子树的所有的值大于它的根节点的值
- 左右子树也是一个二叉查找树
- 没有键值相等的点
2.平衡二叉树(AVL树)
含有形同结点的二叉树的不同形态,找出一个查找平均长度最小的一颗二叉查找树
- 要么是一颗空树,要么其根结点的左右子树的深度之差的值不超过1
- 左右子树也都是平衡二叉树
- 二叉树结点的平衡因子定义为该结点的左子树的深度减去右子树的深度。
平衡因子 = 左子树的深度 - 右子树的深度 -1 0 1
3.红黑树(HashMap重点应用)
自平衡二叉树。又增加了一个颜色的属性。结点的颜色只能是红色或黑色。
-
根节点只能是黑色
-
红黑树中,所有的叶子结点后面再接上左右两个空结点,保持算法的一致性,所有的空结点都是黑色
-
其他的结点要么是黑色,要么是红色,红色结点的父节点和左右孩子结点都是黑色,黑红相间
-
在任一颗子树中,从根节点向下走到空结点的路径上所经理的黑结点数相同,平衡二叉树
4.B-树(B树)
B-树是一种平衡多路查找树,它在文件系统中很有用。
一颗m阶B-树:
- 树中每个子节点至多有m颗子树
- 若根节点不是叶子结点,则至少有2棵子树
- 除根节点外所有非终端结点至少有[m/2]棵子树
- 每个结点的信息结构(A0,K1,A1,K2....Kn,An),其中n表示关键字个数,K为关键字,A是指针
- 所有的叶子结点都出现在同一层次上,且不带任何信息。
5.B+树
B-树和B+树,后序在数据库阶段才会重点应用!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署