前言:数组和链表在存储数据的时候各有优劣。
数组查询快,但是在插入或者删除的时候需要移动数据,还会有扩容的问题。
链表插入和删除快,但是在检索的时候效率低。
树这种存储结构可以有效的同时提高数据的存储和检索效率。
1.树的基本定义:
- 树是由n(n>=0)个有限节点组成的一个具有层次关系的集合。
- 树的特征:
- 每个节点有0个或者多个子节点;
- 没有父节点的节点为根节点;
- 每个非根节点只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不想交的子树;
树的相关术语
- 节点:即树存储数据的对象。
- 根节点:树中唯一没有父节点的节点。
- 父节点:节点的上一层节点,每个节点最多只有一个父节点。
- 子节点:节点的下一层节点,每个节点可以有多个子节点,也可以没有子节点。
- 叶子节点:没有子节点的节点。
- 节点的度:节点的子节点的数量。
- 树的度:一棵树中,最大的节点的度称为树的度。
- 路径:从根节点找到当前节点的路线。
- 节点的层:从根节点开始,根节点的层次为1,根的直接下一层为2,以此类推。
- 高度:树的最大层。
- 森林:由m(m>=0)棵互不相交的树的集合称为森林;将一颗非空树的根节点删除,树就变成了一个森林,给森林增加一个统一的根节点,森林就变成了一颗树。
树的分类:
- 二叉树:只有两个子节点的树
- 查询树
- 平衡树
- 红黑树
- 带权的树
- 霍夫曼树
- 最优二叉树
- 线索二叉树
- 多叉树:超过两个子节点的树
- B树
- B+树
2.二叉树
- 二叉树是每个节点最多有两个子树的树结构,也就是说树的度是2。
- 满二叉树:每一个层的节点树都达到了最大值。
- 完全二叉树:若设二叉树的深度为k,除第k层外,其他各层(1~k-1)的节点树都达到了最大的树,第k层所在的节点都连续集中在最左边。
/**
* 链表实现一颗简单的三层二叉树
*/
public class Binary_Tree1 {
//定义节点类
public class Node{
//存储数据
Object item;
//左子节点
Node left;
//右子节点
Node right;
//判断当前左右指针是否线索化
boolean isLeftThread=false;
boolean isRightThread=false;
public Node(Object obj){
this.item=obj;
}
}
//定义一个根节点
Node root;
//创建一颗树
public void createTree(){
//创建根节点
root=new Node(1);
//创建左子节点
Node leftNode=new Node(2);
//创建右子节点
Node rightNode=new Node(3);
//关联
root.left=leftNode;
root.right=rightNode;
//创建左子节点的左子节点
Node leftLeftNode=new Node(4);
//创建左节点的右子节点
Node leftRightNode=new Node(5);
//关联
leftNode.left=leftLeftNode;
leftNod