
因为在建立平衡二叉树,插入二叉树节点的时候,
如果发现平衡因子不是-1,0,1的时候就会进行调整,而平衡因子是判断一个二叉树的每层是否平衡的数据
在进程调制的时候就会有左单旋,右单旋,左右旋转,右左旋转,通过这四种旋转来使得不管插入多少数据都可以保持平衡二叉树的特点
对着四种旋转方式,我们以图的方式来进行理解:(图中的节点标记单词用于理解源代码)

#include
<iostream>
using
namespace
std;
template
<
class
K
,
class
V
>
struct
AVLTreeNode
{
AVLTreeNode
<
K
,
V
>* _left;
AVLTreeNode
<
K
,
V
>* _right;
AVLTreeNode
<
K
,
V
>* _parent;
K
_key;
V
_value;
int
_bf;
//节点的平衡因子
AVLTreeNode(
const
K
&
key
,
const
V
&
value
)
: _left(
NULL
)
, _right(
NULL
)
, _parent(
NULL
)
, _key(
key
)
, _value(
value
)
, _bf(0)
{ }
};
template
<
class
K
,
class
V
>
class
AVLTree
{
typedef
AVLTreeNode
<
K
,
V
>
Node
;
public
:
AVLTree()
:_root(
NULL
)
{ }
bool
Insert(
const
K
&
key
,
const
V
&
value
)
{
if
(_root ==
NULL
)
{
_root =
new
Node
(
key
,
value
);
return
true
;
}
//找新的节点要插入的位置
Node
* cur = _root;
Node
* parent =
NULL
;
while
(cur)
{
if
(cur->_key <
key
)
{
parent = cur;
cur = cur->_right;
}
else
if
(cur->_key>
key
)
{
parent = cur;
&nb