树:
非线性的数据结构
1、特点:
- 每个结点有零个或多个子节点
- 没有父节点的称为根节点
- 非根节点有且只要一个父节点
- 每个子节点分为多个不相交的子树
- 一颗N个结点的树有N-1条边
2、概念(重要)
-
节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
-
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
-
叶子节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点
-
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
-
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
-
根结点:一棵树中,没有双亲结点的结点;如上图:A
-
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
-
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
3、树的表示形式
class Node {
int value; // 树中存储的数据
Node firstChild; // 第一个孩子引用
Node nextBrother; // 下一个兄弟引用
}
- 树的应用: 文件系统的管理
二叉树
1、二叉树的存储形式
- 顺序存储:用堆 一般存储完全二叉树(数组)
- 链式存储:
(1)三叉链表
数据域 左孩子 右孩子 双亲
(2)二叉链表
数据域 左孩子 右孩子
2、特点
-
每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。
-
二叉树的子树有左右之分,其子树的次序不能颠倒。
3、特殊的二叉树
-
满二叉树:
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。即:
若一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树 -
完全二叉树:
对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
满二叉树是一种特殊的完全二叉树。
3、二叉树的表现形式
// 二叉链表
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
4、二叉树的遍历
- 前序遍历: 根-》左子树-》右子树
- 中序遍历:左子树-》根-》右子树
- 后序遍历: 左子树-》右子树-》根
例如:
- 前序:a b d e h c f g
- 中序:d b e h a f c g
- 后序:d h e b f g c a
如何遍历:递归(大问题化小问题)
- 递归的思想:
(1)终止条件
(2)调用自己