C++算法之二叉树

来源:互联网 发布:ps相片软件下载 编辑:程序博客网 时间:2024/05/16 18:20

1、BST

       即二叉搜索树:

       1.所有非叶子结点至多拥有两个儿子(LeftRight);

       2.所有结点存储一个关键字;

       3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

    

       BST树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;

       如果BST树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变BST树结构插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;

       如:

      

   BST树在经过多次插入与删除后,有可能导致不同的结构:

   右边也是一个BST树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的

树结构索引;所以,使用BST树还要考虑尽可能让BST树保持左图的结构,和避免右图的结构,也就

是所谓的“平衡”问题;      


2、AVL树

算法:http://blog.csdn.net/whucyl/article/details/17289841

定义:平衡二叉树或为空树,或为如下性质的二叉排序树:
  (1)左右子树深度之差的绝对值不超过1;
  (2)左右子树仍然为平衡二叉树.
平衡因子BF=左子树深度-右子树深度.
平衡二叉树每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平衡的。

AVL树属于二叉查找树,二叉查找树的查找和插入操作在最坏情况下复杂度为O(N),而AVL树最坏时仍然为O(lgN)。

AVL树的插入和删除操作需要借助于节点的旋转来保持树的高度平衡。AVL树平衡被破坏时采用的调整规则: 
(1)单旋转:用来修正外侧插入导致的不平衡。 
(2)双旋转:用来修正内侧插入导致的不平衡。可以利用两次单旋完成。

节点的插入结果可以分为四种情况。节点插入之后如果AVL树的平衡遭到破坏,那么,令X为平衡状态被破坏的节点中最深(下方)的节点。

1. 插入点位于X的左子结点的左子树——左左;(外侧插入,单旋)2. 插入点位于X的左子结点的右子树——左右;(内测插入,双旋)3. 插入点位于X的右子结点的左子树——右左;(内测插入,双旋)4. 插入点位于X的右子结点的右子树——右右;(外侧插入,单旋)
  • 1
  • 2
  • 3
  • 4

3、红黑树(RB-tree)

算法:http://blog.csdn.net/whucyl/article/details/17254801

红黑树上每个结点内含五个域,color,key,left,right,p。如果相应的指针域没有,则设为NIL。
一般的,红黑树,满足以下性质:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点,即空结点(NIL)是黑的。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

由红黑树规则知:新增节点必须为红色;新增节点之父节点必须为黑色。

当新增节点根据二叉搜索树的规则到达其插入点,却未能符合红黑树的规则时,就必须调整颜色并旋转树形。

为了更大的弹性,SGI将RB-tree迭代器实现为两层。RB-tree迭代器,但不具备随机定位功能,其提领操作和成员访问操作与list十分近似,较为特殊的是其前进和后退操作。前进操作调用了基层迭代器的increment(),后退操作调用了基层迭代器的decrement()。

RB-tree有定义专属的空间配置器,每次配置一个节点。RB-tree的构造方式有两种,一种是以现有RB-tree复制一个新的RB-tree,另一种是产生一颗空树。


原创粉丝点击