1.树定义
专业定义:
1.有且只有一个称为根的结点
2.有若干个互不相关的子树,这些子树本身也是一棵树
通俗定义
1.树是由结点和边组成
2.每一个结点只有一个父节点,但可以有多个子节点
3.但有一个结点例外,该节点没有父节点,此结点称为根结点
专业术语
结点 父节点 子节点 子孙 堂兄弟
深度:
从根结点到最底层结点的层数称之为深度
根结点是第一层
叶子结点:
没有子结点的结点
非终端结点:
实际就是非叶子结点
度:
子结点的个数称为度
2.树分类
一般树
任意一个结点的子结点的个数都不受限制
二叉树
任意一个结点的子结点个数最多两个,且子结点的位置不可更改(序号)
分类:
一般二叉树
满二叉树
在不增加树的层数的前提下,无法添加一个结点的二叉树就是满二叉树
一个结点的二叉树就是满二叉树
完全二叉树(必须是满的然后再砍)
如果只是删除了满二叉树最底层最右边的连续若干个结点
这样形成的二叉树就是完全二叉树
(满二叉树是完全二叉树的特例,就是一个不删)
森林
n个互不相交的树的集合
红的是一般二叉树
蓝的是补充为 满二叉树
黄色的是砍除部分,称为完全二叉树
3.树的存储
(1)二叉树的存储
连续存储【完全二叉树】(根据序号和算法等)
优点:
查找某个结点的父结点和子结点(也包括判断有没有子节点)速度很快
缺点:
耗用内存空间过大
链式存储(根据指针域指向来存储)
(2)一般树的存储
双亲表示法
求父节点方便
(通过结构体数组或类来存储子节点数据以及父节点的下标)
孩子表示法
求子节点方便
(通过链表来存储子节点)
双亲孩子表示法
求父节点和子节点都很方便
(结合前两种,操作比较复杂)
二叉树表示法
把一个普通树转化成二叉树来存储
具体转换方法:
设法保证任意一个结点的
左指针域指向第一个孩子
右指针域指向它的兄弟
只要满足就可以把一个普通树转化成二叉树
一个普通树转化成二叉树一定没有右子树
(3)森林的存储
类似于一般树的二叉树表示法
4.二叉树操作
遍历
先序遍历【先访问根结点】
先访问根结点
再先序访问左子树
再先序访问右子树
中序遍历【中间访问根结点】
中序遍历左子树
再访问根结点
再中序遍历右子树
后序遍历【最后访问根结点】
中序遍历左子树
中序遍历右子树
再访问根结点
已知两种遍历序列求原始二叉树
通过先序和中序,或者中序和后序可以还原出原始二叉树
但是通过先序和后序无法还原出原始的二叉树
先序和中序:通过先序第一个来判断根结点,之后找到中序的那个根结点后,截断左
边,再找先序中根结点后下一个字母,截断该字母左和右
中序和后序:通过后序第一个来判断根结点,操作与先序只是从后开始的区别
5.应用
树是数据库中数据组织的一种重要形式
操作系统子父系统的关系本身就是一棵树
面向对象语言中类的继承关系
赫夫曼树
(1)术语
结点的路径长度:从根结点到该结点的路径上的连接数
树的路径长度:树中每个叶子结点的路径长度之和
结点带权路径长度:结点的路径长度与结点权值的累加
树的带权路径长度:WPL 树的所有叶子结点的带权路径长度之和
(2)举例
左边 右边
结点的路径长度: A:1 B:2 C:3 D:3 A:3 B:3 C:2 D:1
树的路径长度: 1+2+3+3=9 1+2+3+3=9
结点带权路径长度:A:1*5=5 B:2*15=30 C:3*70=210 D:3*10=30 A:15 B:45 C:140 D:10
树的带权路径长度:275 210
左边的WLP大于右边,所以右边效率更好(WLP越小二叉树性能越高效)