树表的操作
二叉排序树
二叉排序树的定义
二叉排序树的存储结构
二叉排序树的操作
二叉排序树插入
二叉排序树创建
二叉排序树查找
二叉排序树删除
被删除的结点是叶子结点
被删除的结点只有左子树或者右子树
被删除的结点即有左子树又有右子树
平衡二叉树
平衡二叉树的定义
失衡二叉排序树的分析与调整
构造平衡二叉树的基本思想
从问题的发现者(最小不平衡子树)开始判断是那种类型
最小不平衡子树到新加入左/右子树的双亲结点
LL型调整
顺时针旋转
如果一个节点的平衡因子为2,设这个节点为root
它的左孩子,设为node,node = root->lchild;
在node的左孩子新增了一个节点,而导致root的平衡因子为2
那么,我们为了平衡将要进行以下操作
1.root->lchild = node->rchild;
2.node->rchild = root;
将node作为新的根节点,
并且将node的右孩子点(比node大,比root小),接到root的左孩子上
RR型调整
逆时针旋转
如果一个节点的平衡因子为2,设这个节点为root
它的右孩子,设为node,node = root->rchild;
在node的右孩子新增了一个节点,而导致root的平衡因子为2
那么,我们为了平衡将要进行以下操作
1.root->rchild = node->lchild;
2.node->lchild = root;
将node作为新的根节点,
并且将node的左孩子点(比node小,比root大),接到root的右孩子上
LR型调整
设平衡因子为2的节点为root
设平衡因子为2的节点的左孩子
为node,node = root->lchild;
在node节点右孩子新增了一个节点,导致root的平衡因子为2
那么我们要先让node
和node的右孩子
做一次逆时针(RR)
设node的右孩子为temp,temp = node->rchild;
node->rchild = temp->lchild;
temp->rchild = node;
将temp的左孩子(比temp小,比node大),转接到node的右孩子上
然后让temp成为node的根结点,temp成为root的左孩子
此时我们会发现,root,temp,node是在同一个方向的(root > temp > node)
然后我们让root和temp做一个顺时针,使temp作为根节点(LL)
root->lchild = temp->rchild;
temp->rchild = root;
将temp的右孩子(比temp大,比root小),转接到root的左孩子上
temp成为根节点
RL型调整
设平衡因子为2的节点为root
设平衡因子为2的节点的右孩子
为node,node = root->rchild;
在node节点左孩子新增了一个节点,导致root的平衡因子为2
那么我们要先让node
和node左孩子
做一次顺时针旋转(LL)
设node的左孩子为temp,temp = node->rchild;
node->lchild = temp->rchild;
temp->rchild = node;
将temp的右孩子(比temp大,比node小),转接到node的左孩子上
然后让temp成为node的根结点,temp成为root的右孩子
此时我们会发现,root,temp,node是在同一个方向的(root < temp < node)
然后我们让root和temp做一个逆时针旋转,使temp作为根节点(RR)
root->rchild = temp->lchild;
temp->lchild = root;
将temp的右孩子(比temp小,比root大),转接到root的右孩子上
temp成为根节点
习题
如果忘了,就做做下面的题目,用程序先序遍历判断对错
13 10 16 7 17 12 18 9 8
25 18 48 7 76 52 81 70 92 15
25 18 76 13 79 20 9 15 5 77
29 37 23 12 7 25
13 24 37 90 53