树是一种非线性结构,在大量数据进行操作时,线性结构操作速度相对较慢。数是一种很有用的抽象结构。来看下树的几个基本概念。
树上每个元素称之为节点,相邻两个元素间连接关系叫父子关系。没有父节点的元素是根节点,没有子节点的元素叫做叶子节点。一个节点最多只能由一个父节点。
节点的高度:节点到叶子节点的最长路径(该节点-> 叶子节点)
节点的深度:根节点到该节点经过的边数 (根节点 -> 该节点)。根节点的深度是0
树的高度:根节点的高度(根节点 -> 叶子节点)。所有的叶子节点的高度都是0
节点的层次:从根节点数,节点在第几次。
例下面的树:
树的高度是4(A->B->D->J)
B的深度是1
二叉树
二叉树是一种特殊的树形结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点
满二叉树
满二叉树是一种特殊的二叉树,它有如下几个特点:
- 所有非叶子节点都有两个子节点;
- 所有叶子节点都在同一层上;
- 深度为k的二叉树共有2^(k+1)-1个节点。
因此,满二叉树的节点数目是确定的,深度也是确定的。由于具有这些特点,满二叉树的性质很容易被应用到一些问题中,比如堆、哈夫曼编码等。
示例:深度为3的满二叉树。
1
/ \
2 3
/ \ / \
4 5 6 7
完全二叉树
对于除最后一层外,其他层的节点数都达到最大值,即除最后一层外的每一层都是满的,并且最后一层的节点都尽量靠左排列。
叶子节点都在最底下两层。最底层的叶子节点都靠左侧。除了最后一层其它层的节点个数都达到最大。
示例:一颗深度为4的完全二叉树。
1
/ \
2 3
/ \ /
4 5 6
/
7
二叉树的遍历
二叉树的遍历常见的有前序遍历、中序遍历和后续遍历。这三个遍历都是相对根节点来说的。
前序遍历:根节点 -> 左子节点 -> 右子节点
中序遍历:左子节点 -> 根节点 -> 右子节点
后续遍历:左子节点 -> 右子节点 -> 根节点
除了上面说的三种方式还有一种层序遍历。从根节点按节点所在层次依次遍历。