树与二叉树
基本概念
树是一种非线性结构,其严格的数学定义是:如果一组数据中除了第一个节点(第一个节点称为根节点,没有直接前驱节点)之外,其余任意节点有且仅有一个直接前驱,有零个或多个直接后继,
这样的一组数据形成一棵树。这种特性简称为一对多的逻辑关系。即用于描述具有层次关系,类似组织架构关系的一种数据结构。
树的组成:根,分支,叶子
常见例子
日常生活中,很多数据的组织形式本质上是一棵树。比如一个公司中的职员层级关系,一个学校中的院系层级关系,淘汰赛中的各次比赛队伍,一个家族中的族谱成员关系等,这些都是树状逻辑结构。由于树状结构表现出来都是具有层次的,因此也被称为层次结构。
相关术语
通常,在逻辑上表达一棵抽象的树状结构的时候,习惯于将树根放在顶部,树枝树杈向下生长,如下图所示。
对于一棵树来说,有如下基本术语:
1. 结点:
树中的元素 及其子树
2. 根(root):
树的第一个节点,没有直接前驱。如上图中的A。
3. 双亲节点/父节点(parent):
某节点的直接前驱称为该节点的双亲节点,或成为父节点。例如上图中A是B的父节点。
4. 孩子节点/子节点(child):
某节点的直接后继称为该节点的孩子节点。例如上图中B、C、D均为A的孩子节点。
5. 节点的层次(level):
根节点所在的层次规定为第1层,其孩子所在的层次为第2层,后代节点以此类推。比如上图中节点E的层次是3。
6. 节点的度(degree):
一个节点拥有的孩子节点的总数,称为该节点的度。比如上图中节点B的度为2。
7. 叶子(leaf):
一棵树中度等于0的节点,被称为叶子,又称为终端节点。比如上图中K、L、F、G、M、I、J均为叶子。
8. 树的高度(height):
一棵树中所有节点的层次的最大值,称为这棵树的高度,又称为树的深度。比如上图的树的高度为4。
9. 有序树与无序树:
一棵树中,如果某个节点的孩子节点之间是有次序的,则称这棵树为有序树,反之称为无序树。
二叉树
在各种不同的树状结构中,最常见也最重要的是二叉树(Binary Tree),下面是二叉树的定义:
有序树
任意节点的度小于等于2
比如如下这棵树就是一棵二叉树。其中8是根节点,14是10的右孩子(因为二叉树是有序树,因此严格区分左右),而13则是14的左孩子。
为了方便对二叉树进行操作,通常会对一棵它进行标号:从上到下,从左到右进行标号;
注意: 没有孩子节点的地方也要标出来
对于二叉树而言,有如下特性:
第i层上,最多有2^(i−1)个节点。
高度为k的二叉树,最多有2^k−1个节点。
假设叶子数目为n0,度为2的节点数目为n2,则有:n0 = n2+1
二叉树的一般结构:
满二叉树
一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。
**简单理解:**除了叶子节点之外,其余节点的度都为2;其特点是: 如果深度为 K,则节点数为 2^K - 1。
完全二叉树
在一棵二叉树中,除最后一层外,若其余层都是满的,或者最后一层是满的,或者是最后一层在右边缺少连续若干结点,则此二叉树为完全二叉树。
**简单理解:**除最后一层叶子节点外。是一颗满二叉树,最后一层由右向左有连续缺省的0个,1个或多个节点。
二叉搜索树(BST)
特点:
-
如果节点具有左子树,则左子树上所有节点都不大于该节点的值;
-
节点具有右子树,则右子树上所有节点都不小于该节点的值;
-
子树又是二叉搜索数