(都要靠有有方向的链表去实现)
树的定义
专业定义:树是n个节点的有限集,n=0时被称为空树,在任意的一个空树中
1、有且只有一个称为根的节点
2、有若干个互不相交的子树,这些子树本身也是一棵树
通俗定义:
1、树是由节点和边组成
2、每个节点只有一个双亲但可以有多个子节点
3、但有一个节点例外,该节点没有根节点,此节点称为根节点
树的专业术语
-
节点 双亲 祖先 子孙 兄弟 堂兄弟
-
深度/高度:从根节点到最底层节点的层数称之为深度
结点的层次从树根开始定义,根结点为第1层,它的子结点为第2层,以此类推
双亲在同一层的结点互为堂兄弟,图中结点G与E,F,H,I,J互为堂兄弟
结点的深度是从根结点开始自顶向下逐层累加的
结点的高度是从叶结点开始自底向上逐层累加的
树的高度(或深度)是树中结点的最大层数,图中树的高度为4
- 终端节点(叶子节点):(叶子就不能劈叉了)没有子节点的节点
- 非终端节点:实际就是非叶子节点。(根节点可以是非终端节点,也可以是终端节点)
- 度:一个节点的子节点的个数称为度。(一棵树看最大的)
- 有序树和无序树。树中结点的各子树从左到右是有次序的,不能互换,称该树为有序树,否则称为无序树。假设图为有序树,若将子结点位置互换,则变成一棵不同的树。
- 路径和路径长度。树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数。 注意:由于树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径。
- 森林。森林是m (m≥0)棵互不相交的树的集合。森林的概念与树的概念十分相近,因为只要把树的根结点删去就成了森林。反之,只要给m棵独立的树加上一个结点,并把这m棵树作为该结点的子树,则森林就变成了树。
树分类
普通二叉树、完全二叉树、满二叉树、线索二叉树、哈夫曼树、二叉搜索树(排序树)、平衡二叉树、AVL平衡二叉树、红黑树、B树、B+树、堆等
二叉树
-
二叉树:
最多有两棵子树的树被称为二叉树
-
满二叉树
在不增加树的层数的前提下。无法再多添加一个节点的二叉树就是满二叉树。
-
完全二叉树
如果只是删除了满二叉树最底层最右边的连续若干个节点,这样形成的二叉树就是完全二叉树。
遍历
先序遍历【先访问根节点】
先访问根节点
再先序访问左子树
再先序访问右子树
中序遍历【中间访问根节点】
中序遍历左子树
再访问根节点
再中序遍历右子树
后序遍历【最后访问根节点】
先后序遍历左子树
再后序遍历右子树
再访问根节点
已知两种遍历序列求原始二叉树
通过先序和中序 或者 中序和后续我们可以
还原出原始的二叉树
但是通过先序和后续是无法还原出原始的二叉树的
换种说法:
只有通过先序和中序, 或通过中序和后序
我们才可以唯一的确定一个二叉树
应用
树是数据库中数据组织的一种重要形式(例如图书馆的图书分类一层一层往下分。)
操作系统子父进程的关系本身就是一棵树
面向对象语言中类的继承关系本身就是一棵树
赫夫曼树(树的一个特例)