AVL树笔记(二):maintain,delete
来源:互联网 发布:91.v6p.co index.php 编辑:程序博客网 时间:2024/05/21 04:19
先是maintain操作,它可以维护AVLTree的平衡。
有了maintain,AVLTree的insert和delete就可以不马上维护平衡,而是操作完再维护平衡了。
void maintain(int &r){ if(tree[tree[r].lc].h==tree[tree[r].rc].h+2) { int t=tree[r].lc; if(tree[tree[t].lc].h==tree[tree[r].rc].h+1)r=zig(r); else if(tree[tree[t].rc].h==tree[tree[r].rc].h+1)r=zagzig(r); } else if(tree[tree[r].rc].h==tree[tree[r].lc].h+2) { int t=tree[r].rc; if(tree[tree[t].rc].h==tree[tree[r].lc].h+1)r=zag(r); else if(tree[tree[t].lc].h==tree[tree[r].lc].h+1)r=zigzag(r); } tree[r].h=max(tree[tree[r].lc].h,tree[tree[r].rc].h)+1;}
仔细看会发现和昨天的insert的维护平衡比较相似。
就是这次不能凭借tree[r].v和插入值x来比较x在左子树还是右子树了,要根据h来判断。
然后insert就是二叉查找树的insert了:
int insert(int r,int x){ if(r==0) { tree[++cnt].v=x; tree[cnt].h=1; return cnt; } if(tree[r].v>x)tree[r].lc=insert(tree[r].lc,x); else if(tree[r].v<x)tree[r].rc=insert(tree[r].rc,x); maintain(r); return r;}
接下来是delete操作:
首先我们要find,find到了再delete。
要delete的点如果是叶子,那么直接删掉,如果只有一个儿子,那么把这个点删掉,把它的父亲直接连到它的儿子。
如果左右儿子都有,就比较麻烦了。
可以找到它的前驱,把这个点的值修改成前驱的值,最后删掉前驱。
可以证明的是,前驱一定不存在有左右2个儿子都有的状况。
可行是因为删掉这个点,前驱就会上来。还不如直接把这个点改成前驱,再删掉以前那个前驱。
实际实现可以参考find。
find到了,如果是前2种状况,那么删掉,如果是第三种,那么递归删去当前点的前驱。
删完记得维护h值。
int del(int &r,int x){ int tv; if(x==tree[r].v||(x<tree[r].v&&tree[r].lc==0)||(x>tree[r].v&&tree[r].rc==0)) { if(tree[r].lc==0||tree[r].rc==0) { tv=tree[r].v; r=tree[r].lc+tree[r].rc; return tv; } else tree[r].v=del(tree[r].lc,x); } else { if(tree[r].v>x)tv=del(tree[r].lc,x); else tv=del(tree[r].rc,x); } maintain(r); return tv;}
不要直接调用求前驱的函数,貌似时间复杂度会变大= =
0 0
- AVL树笔记(二):maintain,delete
- AVL平衡二叉树(二)
- 平衡二叉树(AVL)代码笔记
- AVL树初学笔记
- 笔记-AVL树
- 学习笔记 AVL树
- PHP二叉树(二):平衡二叉树(AVL)
- PHP二叉树(二):平衡二叉树(AVL)
- 数据结构学习笔记--AVL树
- AVL树学习笔记&模板
- AVL树的学习笔记
- VS2010 C++ 学习笔记(二) 内存管理 new delete
- 算法学习笔记(七) 平衡二叉树 AVL树
- AVL(平衡树)
- 平衡二叉树总结二:avl树
- AVL树(二)之 C++的实现
- AVL树(二)之 C++的实现
- AVL树(二叉平衡树)笔记
- python_1
- OpenSSL 漏洞利用程序脚本 POC
- Java Collection
- 和尚特烦恼2——第几个素数
- 黑马程序员——模板
- AVL树笔记(二):maintain,delete
- 文件的读写与创建简单例子
- Linux中内存相关概念与内存申请的几种方式
- 20151117《Unix环境高级编程》文件apue.h的获取与使用
- 数据结构--Chapter1(绪论)
- 使用influxdb+cadvisor+grafana的docker镜像搭建一个实时监控系统的环境
- 和尚特烦恼3——何时能下山
- android studio gradle初步理解
- 南大软院21天大神养成计划第2天