一篇文章,带你快速读懂~数据结构之平衡查找树( 二 )

< data) {if(this.right == null) {this.right = new Node(data);}else {this.right.add(data);}}//TODO://做完添加操作,if(leftHeight() - rightHeight() > 1) {//如果左子树的高度大于右子树的高度,需要右旋操作 。if(left!=null && this.left.rightHeight()>left.leftHeight()) {System.out.print("左旋再右旋 -- " + left.data);//先对当前节点的左孩子进行左旋left.rotateLeft();//再进行右旋rotateRight();}else {System.out.print("右旋" + data);//直接右旋即可rotateRight();}}if(rightHeight() - leftHeight() > 1) {//如果右子树的高度大于左子树的高度,需要左旋操作if(right!=null && right.leftHeight()>right.rightHeight()) {System.out.print("右旋再左旋-- " + right.data );//先对象当前节点的右孩子右旋right.rotateRight();//再进行左旋操作rotateLeft();}else {System.out.print("左旋-- " + data);//直接左旋节课rotateLeft();}}}/*** @Title: rotateRight* @Description:右旋操作*1、回溯找到失去平衡的节点,以该节点为根,创建一个新节点*2、把新节点的右子树设置为当前节点的右子树*3、把新节点的左子树设置为当前节点的左子树的右子树*4、把当前节点的值换位左子节点的值*5、把当前节点的左子树设置为左子树的左子树*6、把当前节点的右子树设置为新节点* @param:* @return: void* @throws*/private void rotateRight() {//1、回溯找到失去平衡的节点,以该节点为根,创建一个新节点Node tempNode = new Node(data);//2、把新节点的右子树设置为当前节点的右子树tempNode.right = right;//3、把新节点的左子树设置为当前节点的左子树的右子树tempNode.left = left.right;//4、把当前节点的值换位左子节点的值data = left.data;//5、把当前节点的左子树设置为左子树的左子树left = left.left;//6、把当前节点的右子树设置为新节点right = tempNode;}/*** @Title: rotateLeft* @Description:左旋操作:*1、回溯找到失去平衡的节点,以该节点为根,创建一个新节点*2、把新节点的左子树设置为当前节点的左子树*3、把新节点的右子树设置为当前节点的右子树的左子树*4、把当前节点的值替换为右子节点的值*5、把当前节点的右子树设置为右子树的右子树*6、把当前节点的左子树设置为新节点* @param:* @return: void* @throws*/private void rotateLeft() {System.out.println("旋转代码中的 data = " + data);//以根节点为参考,创建新的节点Node tempNode = new Node(data);//把新节点的左子树设置为当前节点的左子树tempNode.setLeft(left);//把新节点的右子树设置为当前节点的右子树的左子树tempNode.setRight(right.left);//把当前节点的值替换为右子树的值data = right.data;//把当前节点的右子树设置为当前节点右子树的右子树right = right.right;//把当前节点的左子树设置为新节点left = tempNode;}/*** @Title: rightHeight* @Description:* @param: @return* @return: int* @throws*/private int rightHeight() {if(right == null) {return 0;}return height(right);}/*** @Title: height* @Description:* @param:* @return: int* @throws*/private int height(Node node) {if(node == null) return 0;return 1+Math.max(height(node.left), height(node.right));}/*** @Title: leftHeight* @Description:* @param: @return* @return: int* @throws*/private int leftHeight() {if(left == null)return 0;return height(left);}/*** @Title: inFixOrder* @Description:* @param:* @return: void* @throws*/public void inFixOrder() {if(this.left!=null) {this.left.inFixOrder();}System.out.println(this.data);if(this.right!=null) {this.right.inFixOrder();}}public Node getLeft() {return left;}public void setLeft(Node left) {this.left = left;}public Node getRight() {return right;}public void setRight(Node right) {this.right = right;}public int getData() {return data;}public void setData(int data) {this.data = data;} }}



推荐阅读