stout

二叉查找树的平衡(DSW算法)

时光总嘲笑我的痴心妄想 提交于 2020-12-17 08:54:07
树适合于表示某些领域的层次结构(比如Linux的文件目录结构),使用树进行查找比使用链表快的多,理想情况下树的查找复杂度 O(log(N)) ,而链表为 O(N) ,但理想情况指的是什么情况呢?一般指树是完全平衡的时候。哪最坏的情况是什么呢?就是树退化为链表的时,这时候查找的复杂度与链表相同。就失去了树结构的意义。所以树的平衡是非常重要的,这一节我们主要讨论树的平衡问题。 <u>如果树中任一节点的两个子树的高度差为0或者1,该二叉树就是高度平衡的。</u> 上图中,A是平衡二叉搜索树,B是不平衡的,C直接退化为链表了。 为保持树的平衡,有两种策略,一种是全局的,即当插入和删除操作完毕后,对树进行重建,全局调整树为平衡树;另一种是局部调整,即当插入或者删除导致树不平衡时就立即在局部范围内调整,使树保持平衡,这个是后面要讨论的AVL树。下面我们先讨论一下全局调整的方法。 有序数组创建二叉查找树 要想实现树的平衡,最简单的想法是我们可以设想一下将树的所有节点从小到大排序后,将中间值作为根节点,左侧的值作为左子树,右侧的所有值作为右子树,每个子树再按根节点的划分方法,以此类推,代码表示如下: // data是排序后的数组 template<class T> void BST<T>::balance (T data[], int first, int last) { if (first <=