AVL树为了保证平衡因子的绝对值不大于1,需要对节点进行旋转。如下面的这篇博文所示。
AVL树的旋转_Colourful.的博客-CSDN博客_avl树旋转
如果想要对树进行旋转,就需要具备两个先要的条件
(1)平衡因子的判断
(2)旋转的类型
【平衡因子】
平衡因子是左右子树深度差,所以平衡因子的计算就是左右子树的深度差值计算。所以只需要通过递归的方式计算左子树和右子树的差值即可。所以问题就转换成了计算树的深度。
【树的旋转类型】
通过上面的引用的博文可知,树的旋转需要知道是是下面的那种类型?
(1)left- left
(2) right - right
(3) left -right
(4) right -left
计算是那种类型只需要在树的深度计算的时候,对树进行递归的时候记录树的递归路径即可
//递归方式求树的深度,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<>();
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。