网易 | 数据结构和算法 | 学习笔记03:树

视频课程:数据结构(浙江大学: 陈越、何钦铭)(第三讲、第四讲)


┏━━━━━━目录━━━━━━┓

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)

(4)注意:
① 子树是 不相交的;
②  除了根结点外, 每个结点有且仅有一个父结点
③ 一棵N个结点的树有 N-1条边




(5)树的一些基本术语

1.结点的度(Degree):结点的子树个数
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)这个集合可以为空
(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。
〖证明〗
边的总数=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( ):创建一个二叉树。
(4)常用的遍历方法有:
①void PreOrderTraversal( BinTree BT ): 先序----根、左子树、右子树;
②void InOrderTraversal( BinTree BT ): 中序---左子树、根、右子树;
③void PostOrderT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值