数据结构——浙大网易云课堂记录(一)树(中篇)
2018-03-02 23:58
323 查看
二叉搜索树
查找操作Find
插入操作Insert
删除操作Delete
平衡二叉树
平衡二叉树高度
平衡二叉树的调整
RR旋转
LL旋转
LR旋转
RL旋转
上述方法中有尾递归,即递归的调用出现在函数末尾,本例是在
如果树“不平衡”,比如所有节点没有右儿子,那么
如果插入值比根节点小,去左子树插值。
如果插入值比根节点大,去右子树插值。
这个函数和搜索有点像,但是多了一个返回值。返回的节点会被赋给父节点的左儿子或右儿子,继而,更新过后(已经插入新节点)的子树会“连”回根节点,一层层向上……
分情况
1.被删的节点是叶节点,直接让它的父节点指向它的指针为null
2.被删的节点只有一个儿子,,让它的父节点指向它的儿子
3.被删的节点左右子树都非空,转化为第二种情况:在左子树中找到最大值(没有右儿子)或在右子树中找到最小值(没有左儿子),用最值节点代替被删节点,然后删除最值节点。
定义平衡因子(Balance Factor,BF):
平衡二叉树(Balanced Binary Tree,AVL Tree):
空树,或者
对任一节点,有
LL旋转
LR旋转
RL旋转
查找操作Find
插入操作Insert
删除操作Delete
平衡二叉树
平衡二叉树高度
平衡二叉树的调整
RR旋转
LL旋转
LR旋转
RL旋转
二叉搜索树
利用二叉树搜索树(BST,Binary Search Tree),提高查找效率。设左儿子的节点值<父节点值<右儿子节点值,在树中搜索
X,每遇到一个节点,将
X的值和节点值做比较,若
X较小,去左子树继续查找;若
X较大,去右子树继续查找;直至全部节点比较完毕或查找到元素。
查找操作Find
Position Find(ElementType X, BinTree BST){ if(!BST) return NULL; // 查找失败 if(X < BST -> Data){ return Find(BST -> Left); }else if(X > BST -> Data){ return Find(BST -> Right); }else{ return BST; // BST -> Data == X } }
上述方法中有尾递归,即递归的调用出现在函数末尾,本例是在
return语句。可以将尾递归函数更改为迭代函数。
Position IterFind(ElementType X, BinTree BST) { while(BST) { if(X < BST -> Data){ BST = BST -> Left; }else if(X > BST -> Right){ BST = BST -> Right; }else{ return BST; } } return NULL; // 查找失败 }
如果树“不平衡”,比如所有节点没有右儿子,那么
N个节点构成的数的深度是
N-1,此时查找次数达不到理想的
log(N)。
插入操作Insert
如果树空,新建节点,给新节点赋值,返回指向该新节点的指针。如果插入值比根节点小,去左子树插值。
如果插入值比根节点大,去右子树插值。
BinTree Insert(ElementType X, BinTree BST){ if(!BST){ BST = malloc(sizeof(struct TreeNode)); BST -> Data = X; BST ->left = NULL; BST -> Right = NULL; }else if(X < BST -> Data){ BST -> Left = Insert(X, BST -> Left); }else(X > BST -> Data){ BST -> Right= Insert(X, BST -> Right); } return BST; }
这个函数和搜索有点像,但是多了一个返回值。返回的节点会被赋给父节点的左儿子或右儿子,继而,更新过后(已经插入新节点)的子树会“连”回根节点,一层层向上……
删除操作Delete
查找到该元素分情况
1.被删的节点是叶节点,直接让它的父节点指向它的指针为null
2.被删的节点只有一个儿子,,让它的父节点指向它的儿子
3.被删的节点左右子树都非空,转化为第二种情况:在左子树中找到最大值(没有右儿子)或在右子树中找到最小值(没有左儿子),用最值节点代替被删节点,然后删除最值节点。
平衡二叉树
树的形状影响搜索效率。定义平衡因子(Balance Factor,BF):
BF(T) = hL - hR,其中
hL、
hR分别是左右子树高度。
平衡二叉树(Balanced Binary Tree,AVL Tree):
空树,或者
对任一节点,有
|BT(T)| <= 1。
平衡二叉树高度
节点数为n,最大高度
O(logn),证明:利用斐波那契数列。
平衡二叉树的调整
RR旋转LL旋转
LR旋转
RL旋转
相关文章推荐
- 数据结构——浙大网易云课堂记录(一)树(上篇)
- 网易云课堂-数据结构
- ORACLE空间管理实验1:探索LMT表空间管理下数据文件头的结构及位图中区的记录方式
- 数据结构(浙大MOOC)第一周
- 记录一下python的数据结构
- 8.2日讲座记录-高级数据结构
- MOOC浙大数据结构 — 03-树1 树的同构 (25分)
- MOOC浙大数据结构 — 08-图7 公路村村通 (30分)
- 项目名称:已知学生的记录由学号和学习成绩构成,4名学生的数据已存入结构体数a中,请编写程序,找出成绩最低的的学生记录并输出。
- 数据结构与算法问题 单源最短路径 浙大OJ
- 浙大数据结构MOOC——堆栈链表注释
- 8.2日讲座记录-高级数据结构
- 02-线性结构1 一元多项式的乘法与加法运算[网易云课堂-数据结构]
- 数据结构3.11答案 递归的查询单链表的其中的记录,以及最大能够让堆栈crash的值
- MOOC浙大数据结构 — 08-图8 How Long Does It Take (25分)
- 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改记录值,4.返回希望的结果)
- [Sqlite]-->嵌入式数据库的安装、建库、建表、更新表结构以及数据导入导出等等详细过程记录
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- 网易云课堂数据结构——二叉搜索树(2015.5.9-10)
- MySQL入门--显示指定数据表的字段结构、插入指定字段的值(记录)、查看指定表中指定字段的所有记录