非线性结构——树
-
树
-
定义
-
有且只有一个称为根的节点
-
有若干个互不相交的子树,这些子树本身也是一颗树
通俗来说
-
树由节点和边组成
-
每个节点都有唯一的父节点,和若干个子节点
-
但是只有根节点是例外的,它没有父节点
-
-
专业术语
- 根节点
- 节点
- 父节点
- 子节点
- 子孙
- 堂兄弟
- 深度:从根节点到最底层节点的层数,根节点是第一层
- 叶子节点:无子结点的节点
- 非终端节点:非叶子节点
- 度:子节点的个数(如果是树的度,则取最大者)
-
分类
-
一般树
任意一个节点的子节点的个数都不受限制
-
二叉树
任意一个节点的子节点个数最多两个,且子节点的位置不可更改
-
一般二叉树
-
满二叉树
在不增加树层数的前提下无法在增加一个节点的二叉树
-
完全二叉树
如果只是删除了满二叉树最底层最右边的连续若干个节点,这样形成的二叉树就是完全二叉树
-
-
森林
n个互不相交的树的集合
-
-
树的存储
-
二叉树的存储
-
连续存储【完全二叉树】
-
优点
查找某个节点的父节点和子节点(也包括判断有没有子节点)速度快
-
缺点
耗用内存空间过大
-
-
链式存储
-
-
一般树的存储
-
双亲表示法:右侧为该左侧节点父节点的下标
求父节点方便
-
孩子表示法
求子节点方便
-
双亲孩子表示法
求父节点和子节点都很方便
-
二叉树表示法
把一个普通树转化位一个二叉树来存储
具体转化方法
设法保证:
任意一个节点的
左指针域指向它的第一个孩子节点
右指针域指向它的下一个兄弟节点
只要能够满足此条件,就可以把一个普通树转化为二叉树
一个普通树转化为二叉树,一定没有右子树
-
-
森林的存储
先把森林转换为二叉树,在存储二叉树:树与树的根节点视为相邻,即B视为A的右侧兄弟节点
-
-
二叉树操作
-
应用
- 树是数据库中数据组织一种重要形式
- 操作系统子父进程的关系是一棵树
- 面向对象语言中类的继承关系
- 赫夫曼树
-