树的概念
树是一种数据结构,树被描述为一种分层数据抽象模型,常用来描述数据间的层级关系和组织结构,树是非线性结构。
树的定义
-
树(Tree): n(n≥0)个结点构成的有限集合。
- 当n=0时,称为空树;否则,称为非空树。
- 对于任一棵非空树(n> 0),它具备以下性质:
- 树中有一个称为“根(Root)”的特殊结点,用 root 表示;
- 其余结点可分为m(m>0)个互不相交的有限集T1,T2,... ,Tm,其中每个集合本身又是一棵树,称为原来树的“子树(SubTree)”
-
子树之间不可以相交
-
除了根结点外,每个结点有且仅有一个父结点;
-
一棵N个结点的树有N-1条边。
树的术语
节点:就是指树中的元素
子节点: 树中一个节点的直属下级节点,若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点。
父节点: 有子树的结点是其子树的根结点的父结点
祖先节点:当前节点的前趋节点(非父节点)
子孙节点:当前结点的下属节点(非直接下属节点)
兄弟结点:具有同一父结点的各结点彼此是兄弟结点
叶子节点:没有子节点的节点元素,叶子节点的度为0
节点的度:节点的度指的是节点分支(子树)的个数
树的度:选取所有节点中最大的度,就是树的度
节点的层次:根节点是第一层节点,表示节点的所属的层数,规定根结点在1层,其它任一结点的层数是其父结点的层数加1
深度:树的层数,表示树的深度
树的深度就是4
森林:n棵互不相交的树的集合
路径和路径长度:从一个节点到另一个节点之间的边和节点构成路径,路径长度是路径所包含边的个数
A到H的路径包含A,C,G,H结点和连接这些结点的三条边,路径长度为3
二叉树
树中每个节点最多只能有两个子节点,这样的树就成为"二叉树"。二叉树可以为空也就是没有节点,若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成。
二叉树有五种形态:
- 注意c和d是不同的二叉树, 因为二叉树是有左右之分的
二叉树有以下特点:
1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。
2)左子树和右子树是有顺序的,次序不能任意颠倒。
3)即使树中某节点只有一棵子树,也要区分它是左子树还是右子树。
一个二叉树第 i 层的最大节点数为:2^(i-1), i >= 1;比如第2层的最大节点数就是2的1次方就是最多只有2个节点
深度为k的二叉树有最大节点总数为: 2^k - 1, k >= 1;
对任何非空二叉树 T,若n0表示叶节点的个数、n2是度为2的非叶节点个数,那么两者满足关系n0 = n2 + 1。
完美二叉树
完美二叉树,也称为满二叉树。在二叉树中除了最下一层的叶结点外,每层节点都有2个子结点,就构成了满二叉树。
满二叉树的特点有:
1)叶子只能出现在最下一层。出现在其它层就不可能达成平衡。
2)非叶子结点的度一定是2。
3)在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多。
完全二叉树
完全二叉树,在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]是向下取整
- 除二叉树最后一层外,其他各层的节点数都达到最大个数.
- 且最后一层所有的节点在左边的连续排列,空位都在右边.
- 完美二叉树是特殊的完全二叉树.
下面不是完全二叉树,因为D节点还没有右结点,但是E节点就有了左右节点
二叉树的存储
顺序存储
二叉树的顺序存储结构就是使用一维数组存储二叉树中的结点,并且结点的存储位置,就是数组的下标索引。
下图所示一棵完全二叉树采用顺序存储方式
当二叉树为完全二叉树时,节点数刚好填满数组
当二叉树不为完全二叉树时,采用链表存储
链表存储
- 二叉树最常见的方式还是使用链表存储
- 每个节点封装成一个Node,Node中包含存储的数据,左节点的引用以及右节点的引用