平衡二叉树

平衡二叉树

  • 简介
    • 平衡二叉树(AVL)的定义
    • 平衡二叉树的单旋转
    • 双旋转
    • 代码
    • Node类
    • AVLTree类
    • TestAVLTree类

简介

虽然搜索二叉树在查询,删除,添加上具有一定的优势,但是在一些情况下的效率也特别低。比如下面的这个搜索二叉树:
平衡二叉树_第1张图片
对于这样的搜索二叉树,我们进行添加,查找,删除时依然很麻烦。因此,我们需要将这样的搜索二叉树转为平衡二叉树。

平衡二叉树(AVL)的定义

首先,平衡二叉树是搜索二叉树。其次,平衡二叉树的左子树和右子树高度的绝对值不超过1.

平衡二叉树的单旋转

对于左左结构的二叉树:
平衡二叉树_第2张图片
对图3进行右旋步骤的详解:
平衡二叉树_第3张图片
对节点8进行旋转
第一步:创建一个和当前节点值一样的节点。
平衡二叉树_第4张图片
第二步:把当前节点的右节点赋值给新节点的右节点。
平衡二叉树_第5张图片
第三步:如果当前节点的左节点的右节点不为空,则把它赋值给新节点的左节点。
平衡二叉树_第6张图片
第四步:将当前节点的左节点的值赋给当前节点。
平衡二叉树_第7张图片
第五步:删除当前节点的左节点,即把当前节点的左节点的左节点赋值给当前节点的左节点。
平衡二叉树_第8张图片
第六步:将新节点赋值给当前节点的右节点
平衡二叉树_第9张图片

对于右右结构的二叉树,我们采用左旋,方法与右旋类似。

双旋转

对于下面结构的二叉树,我们通过单旋转无法将它转为平衡二叉树,因此我们就需要双旋转即两次旋转
平衡二叉树_第10张图片
对于这样的二叉树转为平衡二叉树,我们需要分两步进行。
第一步:对节点5进行左旋
平衡二叉树_第11张图片
第二步:对节点8进行右旋
平衡二叉树_第12张图片

代码

Node类

package com.wuxudong.AVLTree;

public class Node {

    int value;
    Node left;
    Node right;

    public Node(int value){
        this.value=value;
    }

    //添加方法
    public void add(Node node){
        //判断当前节点和传入的节点的大小
        if(node.value=2){

            if (left!=null&&left.leftHeight()node.value){
            return this.left.findParent(node);
        }else if (this.value

你可能感兴趣的:(数据结构)