树和二叉树(1)——概念
树的定义与基本操作
树描述的是一种层次结构,如下图所示,下图中节点 A 为树的根节点,一颗树有且仅有一个根节点。树的定义是递归的,当树节点数量大于 1 时,除根结点外的其他节点构成根节点的子树。
树中的一些概念
- 节点:表示树中的元素项。
- 节点的度数:节点拥有的子树个数。
- 树的度数:树中最大的节点度数。
- 叶子节点:度数为 0 的节点。
- 树的层次:根节点为第一层,根节点的子节点为第二层,以此类推。
- 树的深度:数中节点最大层次数。
- 子节点、父节点、兄弟节点、堂兄弟节点(父节点在同一层)。
- 森林: 棵树的集合称为森林() 。
二叉树
定义:任意节点的子数个数都不超过两个的树称为二叉树。二叉树区分左右,二叉树有五种基本形态,如下图所示。
1. 满二叉树
-
定义:深度为 且节点数为 的二叉树称为满二叉树。
-
满二叉树特点
a. 只有度为 0 和 2 的节点
b. 二叉树中每一层节点数都达到最大
c. 叶节点只出现在最底层(第 层)
2. 完全二叉树
-
定义: 从满二叉树最底层最右叶子节点开始从右向左,自下而上删除 个节点() 之后的树称为完全二叉树,一个完全二叉树的例子如下图所示。
-
二叉树的存储结构,多采取链式存储,也可采用顺序存储。链式存储有两种实现方式,一种是二叉链表,每个节点有两个指针,分别指向左右孩子;另一种为三叉链表,在二叉链表基础上增加一个指针域指向父节点。
-
二叉树的遍历
a. 前序遍历:先根节点然后左子树,最后右子树。
b. 后序遍历:先左子树然后右子树,最后根节点。
c. 中序遍历:先左子树然后根节点,最后右子树。
d. 层次遍历:从左往右,从上向下,一层一层遍历。以上面示例中的三层满二叉树为例,这四种遍历方式的顺序分别为:
a. 前序遍历:A→B→D→E→C→F→G
b. 后序遍历:D→E→B→F→G→C→A
c. 中序遍历:D→B→E→A→F→C→G
d. 层次遍历:A→B→C→D→E→F→G
树与森林
-
树的孩子兄弟存储结构,每个节点存在两个指针域,一个指向第一个孩子节点,一个指向第一个兄弟节点,如下图所示。
-
树和二叉树的互相转化
由于孩子兄弟存储结构是二叉链表形式,与二叉树的二叉链表存储结构类似,只是指针域代表的含义不同,所以二叉树和树之间可以进行相互转换。以 1 中的孩子兄弟链表为例,改变其指针域的含义,用左孩子指针代替长子节点指针,右孩子指针代替兄弟指针,就可以将孩子兄弟链表存储的树转换为一棵二叉树,如下图所示,由于根节点没有兄弟节点,所以由孩子兄弟链表存储的树转换得来的二叉树没有右子树。