视频课程:数据结构(浙江大学: 陈越、何钦铭)(第三讲、第四讲)
┏━━━━━━目录━━━━━━┓
3.1 树与树的表示
3.2 二叉树及存储结构
3.3 二叉树的遍历
4.1 二叉搜索树
4.2 平衡二叉树
4.3 堆
4.4 哈夫曼树与哈夫曼编码
4.5 集合及运算
┗━━━━━━━━━━━━━━┛
3.1 树与树的表示
(层次关系:分层次组织在管理上具有更高的效率)
1、引子:查找——根据某个给定关键字K ,从集合R中找出关键字与K相同的记录
(1)静态查找:集合中记录是固定的——没有插入和删除操作,只有查找
〖方法1〗顺序查找:时间复杂度为O(n)
* 算法技巧:建立哨兵
〖方法2〗二分查找(Binary Search):时间复杂度O(logN)
[注]:为什么是logN?因为每次查找范围除以2,一直除到1
① 假设n个数据元素的关键字满足有序(比如:小到大)
② 并且是连续存放(数组),那么可以进行二分查找。
* left > right ? 查找失败,结束
* 二分查找判定树
(以11个元素为例)
① 判定树上每个结点需要的查找次数刚好为该结点所在的层数;
② 查找成功时查找次数不会超过判定树的深度
(查找效率是树的高度)
n个结点的判定树的深度为:[log(2,n)]+1.【以2为底n的对数,取整+1】
平均成功查找次数 ASL = (4*4+4*3+2*2+1)/11 = 3
(2)动态查找:集合中记录是动态变化的—— 除查找,还可能发生插入和删除
【见4.1二叉搜索树】
3、
树的定义
(1)树(Tree): n(n≥0)个结点构成的有限集合。
(2)当n=0时,称为
空树;
(3)对于任一棵非空树(n> 0),它具备以下性质:
① 树中有一个称为“ 根(Root)”的特殊结点,用 r 表示;
② 其余结点可分为m(m>0)个 互不相交的有限集T1,T2,... ,Tm,其中每个集合本身又是一棵树,称为原来树的“ 子树(SubTree)”
(3)对于任一棵非空树(n> 0),它具备以下性质:
① 树中有一个称为“ 根(Root)”的特殊结点,用 r 表示;
② 其余结点可分为m(m>0)个 互不相交的有限集T1,T2,... ,Tm,其中每个集合本身又是一棵树,称为原来树的“ 子树(SubTree)”
(4)注意:
① 子树是
不相交的;
② 除了根结点外, 每个结点有且仅有一个父结点;
③ 一棵N个结点的树有 N-1条边。
② 除了根结点外, 每个结点有且仅有一个父结点;
③ 一棵N个结点的树有 N-1条边。
(5)树的一些基本术语
2.树的度:树的所有结点中最大的度数
3.叶结点(Leaf):度为0的结点
4.父结点(Parent):有子树的结点是其子树的根结点的父结点
5.子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点。
6.兄弟结点(Sibling):具有同一父结点的各结点彼此是兄弟结点。
7.路径和路径长度:从结点n1到nk的路径为一个结点序列n1 , n2 ,… , nk , ni是 ni+1的父结点。路径所包含边的个数为路径的长度。
9. 祖先结点(Ancestor):沿树根到某一结点路径上的所有结点都是这个结点的祖先结点。
10. 子孙结点(Descendant):某一结点的子树中的所有结点是这个结点的子孙。
11. 结点的层次(Level):规定根结点在1层,其它任一结点的层数是其父结点的层数加1。
12. 树的深度(Depth):树中所有结点中的最大层次是这棵树的深度。
4、
树的表示:儿子-兄弟表示法
(1)n个节点,n-1条边,指针域2n,空指针2n-(n-1)=n+1
(2)将这棵树旋转45°得到一颗二叉树
3.2 二叉树及存储结构
1、 二叉树的定义:一个有穷的结点集合。
1、 二叉树的定义:一个有穷的结点集合。
(1)这个集合可以为空
(2)若不为空,则它是由 根结点和称为其 左子树TL和 右子树TR的两个不相交的二叉树组成。
(3)二叉树具体五种基本形态(空树、只有一个结点、左子树非空、右子树非空、都非空)
(2)若不为空,则它是由 根结点和称为其 左子树TL和 右子树TR的两个不相交的二叉树组成。
(3)二叉树具体五种基本形态(空树、只有一个结点、左子树非空、右子树非空、都非空)
(4)与度为2的一般树的区别为:二叉树的子树有左右顺序之分(见上图cd,是不同的情况)
2、
特殊二叉树
(1)斜二叉树(Skewed Binary Tree)——线性结构
(2)完美二叉树(Perfect Binary Tree) 满二叉树(Full Binary Tree)
(3)
完全二叉树 (Complete Binary Tree) 有n个结点的二叉树,对树中结点按从上至下、从左到右顺序进行编号,编号为i(1 ≤ i ≤ n)结点与满二叉树中编号为 i 结点在二叉树中位置相同{tip:只能缺右下那一块儿叶结点}
(斜二叉树,完美二叉树)
3、二叉树几个重要性质
(1)一个二叉树第 i 层的最大结点数为:2^( i-1),i ≥ 1。 ——2、4、8、16……
(2)深度为k的二叉树有最大结点总数为:2^k -1,k ≥ 1。——对(1)求和
(3)对任何非空二叉树 T,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0 = n2 +1。
(3)对任何非空二叉树 T,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0 = n2 +1。
〖证明〗
边的总数=n0+n1+n2-1 (向上看:每个结点都有一条边,唯一的根结点向上没有边)
=0*n0+1*n1+2*n2 (向下看:叶结点没有边,度为1的结点1条边,度为2的结点两条边)
化简后得n0 = n2 +1,证毕。
4、
二叉树的抽象数据类型定义
(1)类型名称:二叉树
(2)数据对象集:一个有穷的结点集合。若不为空,则由根结点和其左、右二叉子树组成。
(3)操作集: BT BinTree, Item ElementType,重要操作有:
①Boolean IsEmpty( BinTree BT ): 判别BT是否为空;
②void Traversal( BinTree BT ): 遍历,按某顺序访问每个结点;
③BinTree CreatBinTree( ):创建一个二叉树。
(2)数据对象集:一个有穷的结点集合。若不为空,则由根结点和其左、右二叉子树组成。
(3)操作集: BT BinTree, Item ElementType,重要操作有:
①Boolean IsEmpty( BinTree BT ): 判别BT是否为空;
②void Traversal( BinTree BT ): 遍历,按某顺序访问每个结点;
③BinTree CreatBinTree( ):创建一个二叉树。
(4)常用的遍历方法有:
①void PreOrderTraversal( BinTree BT ): 先序----根、左子树、右子树;
②void InOrderTraversal( BinTree BT ): 中序---左子树、根、右子树;
③void PostOrderT
①void PreOrderTraversal( BinTree BT ): 先序----根、左子树、右子树;
②void InOrderTraversal( BinTree BT ): 中序---左子树、根、右子树;
③void PostOrderT