这里我们主要讲二叉排序树的操作:
什么是二叉排序树?
Tip : 中序(左根右)遍历二叉排序树会得到一个关键字的递增有序序列
查找步骤:
算法思想:
算法描述:
BSTree SearchBST(BSTree T,KeyType key)
{
if((!T) || key == T->data)
return T;
else if (key < T->data)
return SearchBST(T->lchild,key); //在左子树中继续查找
else
return SearchBST(T->rchild,key); //在右子树中继续查找
} // SearchBST
查找的性能分析:
平均查找长度和二叉树的形态有关,即,
最好:log2n(形态匀称,与二分查找的判定树相似)
最坏: (n+1)/2(单支树)
问题:如何提高二叉排序树的查找效率? —— 尽量让二叉树的形状均衡
平衡二叉树(AVL树):
对于一棵有 n 个结点的AVL树,其高度保持在 O(log2n) 数量级,ASL也保持在 O(log2n) 量级。
如果在一棵 AVL 树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,
使之恢复平衡。我们称调整平衡过程为平衡旋转。
LL平衡旋转:
若在A的左子树的左子树上插入结点,使A的平衡因子从1增加至2,需要进行一次顺时针旋转。
(以B为旋转轴)
=========》
RR平衡旋转:
若在A的右子树的右子树上插入结点,使A的平衡因子从-1增加至-2,需要进行一次逆时针旋转。
(以B为旋转轴)
=========》
LR平衡旋转:
若在A的左子树的右子树上插入结点,使A的平衡因子从1增加至2,需要先进行逆时针旋转,再顺时针旋转。
(以插入的结点C为旋转轴)
==①==》==②==》
解释:这里步骤①是根据二叉排序树的特点 A>C>B来做的,因为C>B所以将B作为C的左孩子。
步骤②就是LL平衡转换
RL平衡旋转:
若在A的右子树的左子树上插入结点,使A的平衡因子从-1增加至-2,需要先进行顺时针旋转,再逆时针旋转。
(以插入的结点C为旋转轴)
==①==》==②==》
解释:这里步骤①是根据二叉排序树的特点B>C>A来做的,因为B>C所以将B作为C的右孩子。
步骤②就是RR平衡转换
插入步骤:
注意:插入的元素一定在叶子结点上
要求:
1.将因删除结点而断开的二叉链表重新链接起来
2.防止重新链接后的树的高度增加
删除总结:
实例:
原文地址:http://blog.csdn.net/u013271921/article/details/45950753