zl程序教程

您现在的位置是:首页 >  后端

当前栏目

AVL树计算平衡因子的计算与AVL树的旋转类型Java代码

JAVA计算代码 类型 旋转 平衡 因子 AVL
2023-06-13 09:11:56 时间

1、本篇博文的目标

AVL树为了保证平衡因子的绝对值不大于1,需要对节点进行旋转。如下面的这篇博文所示。

AVL树的旋转_Colourful.的博客-CSDN博客_avl树旋转

如果想要对树进行旋转,就需要具备两个先要的条件

(1)平衡因子的判断

(2)旋转的类型

2、如何计算平衡因子和不平衡的情况下的旋转类型

【平衡因子】

平衡因子是左右子树深度差,所以平衡因子的计算就是左右子树的深度差值计算。所以只需要通过递归的方式计算左子树和右子树的差值即可。所以问题就转换成了计算树的深度。

【树的旋转类型】

通过上面的引用的博文可知,树的旋转需要知道是是下面的那种类型?

(1)left- left

(2) right - right

(3) left -right

(4) right -left

计算是那种类型只需要在树的深度计算的时候,对树进行递归的时候记录树的递归路径即可

3、代码

//递归方式求树的深度,TreeTrace类里面有两个变量,一个是depth,该值就是树的深度。另外一个是trace,
//是arrayLIst的集合,该集合就记录了树的旋转类型
//计算平衡因子只需要把getDepth(左子树的节点)的depth和getDepth右子树的depth相减即可。
public static Treetrace getDepth(SearchTreeNode currentNode) {

         if (currentNode == null){
            return new Treetrace();
        }

        Treetrace rightTrace = getDepth(currentNode.right);
        Treetrace leftTrace = getDepth(currentNode.left);
        if (rightTrace.depth>leftTrace.depth){
            rightTrace.depth++;
            if (currentNode.right != null || currentNode.left!=null){
                rightTrace.trace.add("right");
            }
            return rightTrace;
        }
        else {
            if (currentNode.right != null || currentNode.left!=null){
                leftTrace.trace.add("left");
            }
            leftTrace.depth++;
            return leftTrace;
        }
    }
}

class SearchTreeNode{
    SearchTreeNode parent ;
    SearchTreeNode left ;
    SearchTreeNode right ;
    int value;

    SearchTreeNode(int value){
        this.value = value;
        parent = null;
        right = null;
        left = null;
    }
}

class Treetrace{
    int depth=0;
    ArrayList<String> trace = new ArrayList<>();
}