首先平衡二叉树的原理是:一个一个节点的向二叉树中添加,如果添加的节点大于其父节点则添加到右子树中,如果小于其父节点则放在左子树中。且左右子树高度的绝对值不大于一。如果左右子树高度出现不平衡,需要进行调整,会出现的情况有,左左型,左右型,右右型,右左型。
下面是代码实现:
添加节点并平衡二叉树
public Node insertNode(int element)
{
Node newnode = super.insertNode(element);
relance((AVLnode)newnode);
return newnode;
}
控制树的高度
protected void relance(AVLnode node)
{
int leftheigh = (AVLnode)node.left ==null?-1:((AVLnode)node.left).height;
int rightheight = (AVLnode)node.right==null?-1 :((AVLnode)node.right).height;
int relanceheight = rightheight - leftheigh;
while(node!=null)
{
Node parent = node.parent;
if(relanceheight == 2)
{
if(node.right.right!=null)
{
node = (AVLnode) valrotateleft(node);
break;
}
else {
node = (AVLnode) doublerotateleftright(node);
break;
}
}else if(relanceheight == -2)
{
if(node.left.left != null)
{
node = (AVLnode) valrotateright(node);
break;
}
else {
node = (AVLnode) doublerotaterightleft(node);
break;
}
}
else {
updateheight(node);
}
node = (AVLnode) parent;
}
}
左旋节点
```java
protected Node valrotateleft(Node node) {
Node temp = super.rotateleft(node);
updateheight((AVLnode)temp.left );
updateheight((AVLnode)temp);
return temp;
}
右旋节点
protected Node valrotateright(Node node)
{
Node tempNode = super.rotateright(node);
updateheight((AVLnode)tempNode.right);
updateheight((AVLnode)tempNode);
return tempNode;
}
取右子节点,先把它旋转到右侧,在把根节点节点旋转到左侧
protected Node doublerotaterightleft(Node node)
{
node.right = valrotateright(node.right);
return valrotateleft(node);
}
取左子节点,先把它旋转到左侧,在把根节点节点旋转到右侧
protected Node doublerotateleftright(Node node)
{
node.left = valrotateleft(node.left);
return valrotateright(node);
}