C++算法之二叉树
来源:互联网 发布:ps相片软件下载 编辑:程序博客网 时间:2024/05/16 18:20
1、BST树
即二叉搜索树:
1.所有非叶子结点至多拥有两个儿子(Left和Right);
2.所有结点存储一个关键字;
3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;
BST树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;
如果BST树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变BST树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;
如:
但BST树在经过多次插入与删除后,有可能导致不同的结构:
右边也是一个BST树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的
树结构索引;所以,使用BST树还要考虑尽可能让BST树保持左图的结构,和避免右图的结构,也就
是所谓的“平衡”问题;
2、AVL树
(1)左右子树深度之差的绝对值不超过1;
(2)左右子树仍然为平衡二叉树.
平衡因子BF=左子树深度-右子树深度.
平衡二叉树每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平衡的。
AVL树属于二叉查找树,二叉查找树的查找和插入操作在最坏情况下复杂度为O(N),而AVL树最坏时仍然为O(lgN)。
AVL树的插入和删除操作需要借助于节点的旋转来保持树的高度平衡。AVL树平衡被破坏时采用的调整规则:
(1)单旋转:用来修正外侧插入导致的不平衡。
(2)双旋转:用来修正内侧插入导致的不平衡。可以利用两次单旋完成。
节点的插入结果可以分为四种情况。节点插入之后如果AVL树的平衡遭到破坏,那么,令X为平衡状态被破坏的节点中最深(下方)的节点。
- 1
- 2
- 3
- 4
3、红黑树(RB-tree)
一般的,红黑树,满足以下性质:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点,即空结点(NIL)是黑的。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。
由红黑树规则知:新增节点必须为红色;新增节点之父节点必须为黑色。
当新增节点根据二叉搜索树的规则到达其插入点,却未能符合红黑树的规则时,就必须调整颜色并旋转树形。
为了更大的弹性,SGI将RB-tree迭代器实现为两层。RB-tree迭代器,但不具备随机定位功能,其提领操作和成员访问操作与list十分近似,较为特殊的是其前进和后退操作。前进操作调用了基层迭代器的increment(),后退操作调用了基层迭代器的decrement()。
RB-tree有定义专属的空间配置器,每次配置一个节点。RB-tree的构造方式有两种,一种是以现有RB-tree复制一个新的RB-tree,另一种是产生一颗空树。
- 算法导论 之 平衡二叉树 - 删除 - 递归[C语言]
- 算法导论 之 平衡二叉树 - 打印 - 递归[C语言]
- 算法之二叉查找树
- 算法练习之二叉树
- 算法04 之二叉树
- 算法基础之二叉树
- C++算法之二叉树
- C语言的二叉树算法 上
- C语言的二叉树算法 下
- c#-二叉树数据结构及算法
- 二叉树的一些通用算法(C)
- C语言 二叉查找树相关算法
- Linux C 算法与数据结构 --二叉树
- Linux C 算法与数据结构 --二叉树
- C语言基础 16 二叉树 算法
- 二叉树算法c语言描述
- c语言实现二叉树常用算法
- 数据结构之树和二叉树算法实现(C语言)
- 微信公众平台开发接口配置URL index.php和token,
- plsql 调用存储过程
- 机器学习(一)----k-近邻算法
- 理解RESTful架构
- laravel 5.3 GROUP BY 问题
- C++算法之二叉树
- 在同个输出如何同时输出a和b
- BugFree的7种解决方案各自的含义是什么?
- python---删除链表中倒数第n个节点
- 修改 service_name
- thinkphp5 权限问题(一)
- CSS-PX EM REM
- DockContent的使用
- Listview 和RecycleView的异同