树
树的定义
专业定义:
- 有且只有一个称为根的节点
- 有若干个互不相交的子树,这些子树本身也是一颗树
通俗的定义
- 树是由节点和边组成
- 每个节点只有一个父节点但可以有多个子节点
- 但有一个节点例外,该节点没有父节点,此节点称为根节点
专业术语
- 节点
- 父节点
- 子节点
- 子孙
- 堂兄弟
- 层次
- 从根节点到最底层节点的层数称为深度
- 根节点是第一层
- 叶子节点
- 没有子节点的节点
- 非终端节点
- 实际非叶子节点
- 度
- 子节点的个数
树的分类
一般树
- 任意一个节点的子节点的个数都不受限制
二叉树
- 任意一个节点的子节点个数最多两个,且子节点的位置不可更改
分类
- 一般二叉树
- 满二叉树
- 在不增加树层数的前提下,无法再添加一个节点的二叉树就是满二叉树
- 高度为h,且有 个节点的二叉树
- 完全二叉树
- 如果只是删除了满二叉树最底层最右边的连续若干个节点,这样形成的二叉树就是完全二叉树
- 扩充二叉树(2-树)
- 仅存在度为2和0的节点
- 不存在度为1的节点
森林
- n个互不相交的树的集合
树的存储
- 二叉树的存储
- 一般树的存储
- 双亲表示法
- 求父节点方便
- 孩子表示法
- 求子节点方便
- 双亲孩子表示法
- 求父节点和子节点都很方便
- 二叉树表示法
- 把一个普通树转化成二叉树存储
- —>具体方法
- 设法保证任意一个节点的
- 左指针域指向他的第一个孩子
- 右指针域指向它的第一个兄弟
- 只要能满足此条件,就可以把一个普通树转化为二叉树
- 一个普通树转化成的二叉树一定没有右子树
- 设法保证任意一个节点的
- —>具体方法
- 把一个普通树转化成二叉树存储
- 双亲表示法
- 森林的存储
- 先把森林转化为二叉树,再存储二叉树
二叉树的操作
- 遍历
- 先序遍历【先访问根节点】
- 先访问根节点
- 再先序访问左子树
- 再先序访问右子树
- 例子:
- 中序遍历【中间访问根节点】
- 中序遍历左子树
- 再访问根节点
- 再中序遍历右子树
- 例子:
- 后序遍历【最后访问根节点】
- 后序遍历左子树
- 后序遍历右子树
- 再访问根节点
- 例子:
- 先序遍历【先访问根节点】
- 已知两种遍历序列求原始序列
- 通过先序和中序 或者 中序和后序我们可以还原出原始的二叉树
- 但是通过先序和后序是无法还原出原始的二叉树的
- 换种说法:
- 只有通过先序和中序,或通过中序和后序才可以唯一确定一个二叉树
- 换种说法:
- 例子(1):
- 例子(2):
应用
- 树是数据库中数据组织一种重要形式
- 操作系统子父进程的关系本身就是一棵树
- 面向对象语言中类的继承关系本身就是一棵树
- 赫夫曼数