本文共 3933 字,大约阅读时间需要 13 分钟。
思路分析:
用{4,3,6,5,7,8}创建对应的平衡二叉树//返回左子树的高度 public int leftHeight(){ if(left == null){ //左子树为空,说明已经到达底部 return 0; } return left.height(); } //返回右子树的高度 public int rightHeight(){ if(right == null){ return 0; } return right.height(); } //返回以该节点为根节点的这棵子树的高度 /** * 计算以调用该方法的结点为根节点的子树的高度,从一开始计算 * @return 返回的是整型, */ public int height(){ return Math.max(left == null ? 0:left.height(),right == null ? 0:right.height()) + 1; //加上自身的递归条件,每增加一层就在原来的基础上再增加一 } public void leftRotate(){ //创建新的结点,以当前根节点值为创建点 Node newNode = new Node(value); //将新的节点的左子树指向当前节点的左子树 newNode.left = this.left; //将新的结点的右子树指向当前节点右子树的左子树 newNode.right = this.right.left; //将当前节点的值变为当前节点右子树的值 this.value = this.right.value; //将当前节点的右子树指向原右子树的右子树 this.right = this.right.right; //将当前结点的左子树指向新建结点 this.left = newNode; }
同左旋转,仅仅只是方向有了改变。
public void rightRotate(){ // 新建节点,其值等于当前结点 Node newNode = new Node(this.value); //新建节点的左子树,等于当前节点的左子树 newNode.right = this.right; //新建节点的右子树指向当前节点的右子树的左子树 newNode.left = this.left.right; //将当前结点的右子树指向右子树的右子树 this.right = this.right.right; //当前节点的值等于左子节点的值 this.value = this.left.value; //将当前节点的左子树指向新建结点 this.left = newNode; }
右旋转:原数组整体偏左,左边的高度大于右边,同时左子树也是整体偏左,即左子树的左子树高度大于左子树的右子树高度
class AVLTree中的类
/** * 添加对应的结点 * * @param node */ public void add(Node node) { if (node == null) { return; } if (node.value < this.value) { if (this.left == null) { this.left = node; } else { this.left.add(node); } } else { if (this.right == null) { this.right = node; } else { this.right.add(node); } } //右高左低,向左进行旋转,中和高度 if (rightHeight() - leftHeight() > 1){ if(right != null && right.leftHeight() - right.rightHeight() > 1){ right.leftRotate(); leftRotate(); }else{ leftRotate(); } } //左高右低,向右进行旋转,中和高度 if(leftHeight() - rightHeight() > 1){ if(left != null && left.rightHeight() > left.leftHeight()){ left.leftRotate(); rightRotate(); }else{ rightRotate(); } } //想法,应该是从下往上进行判断,所以个人认为应该进行递归调用 }
转载地址:http://eqgpb.baihongyu.com/