AVL高度求解
package avl;
public class AVLTreeDemo {
public static void main(String[] args) {
int arr[]=new int[]{4,3,6,5,7,8};
//创建一个AVLTree对象
AVLTree avlTree = new AVLTree();
//添加节点
for (int i=0;i node.value){
if (this.left != null){
this.left.add(node);
}else {
this.left = node;
}
}else { // 如果value相等 也走右边节点
if (this.right != null){
this.right.add(node);
}else {
this.right = node;
}
}
}
// 中序遍历
public void infixOrder(){
if(this.left != null){
this.left.infixOrder();
}
System.out.print(this.value+" ");
if (this.right != null){
this.right.infixOrder();
}
}
public Node search (int value){
if (value == this.value) { // 找到就是该节点
return this;
}else if (value < this.value){//如果查找的值小于当前结点,向左子树递归查找
if(this.left != null){
return left.search(value);
}else {
return null;
}
}else { //如果查找的值不小于当前结点,向右子树递归查找
if(this.right != null){
return this.right.search(value);
}else {
return null;
}
}
}
public Node searchParent(int value){
//如果当前结点就是要删除的结点的父节点,就返回
if (this.left != null && this.left.value == value){
return this;
}else if(this.right != null && this.right.value == value){
return this;
}else {
// 如果查找的值 小于当前节点的值 , 并且当前的节点左子节点不为空
if(value < this.value && this.left != null){
return this.left.searchParent(value);//向左子树递归查找
}else if(value >= this.value && this.right != null){
return this.right.searchParent(value);//向右子树递归查找
}else {
// 真的找不到了 没有父节点
return null;
}
}
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
", left=" + left +
", right=" + right +
'}';
}
}
输出:
AVL树左旋转代码实现
在Node类中新增左旋转方法
//左旋转方法
private void leftRotate(){
//创建新的结点。以当前根节点的值
Node newNode = new Node(value);
//把新节点的左子树设置成当前结点的左子树
newNode.left=left;
//把新节点的右子树设置成当前结点的右子树的左子树
newNode.right=right.left;
//把当前结点的值替换成右子结点的值
value=right.value;
//把当前结点的右子树设置成当前结点的右子树的右子树
right=right.right;
//把当前结点的左子树(左子节点)设置成新的结点
left=newNode;
}
在Node类中修改添加节点方法、
// 添加节点的方法
// 递归添加节点,主义需要满足二叉排序树的要求
public void add(Node node){
if (node == null){
return;
}
if(this.value > node.value){
if (this.left != null){
this.left.add(node);
}else {
this.left = node;
}
}else { // 如果value相等 也走右边节点
if (this.right != null){
this.right.add(node);
}else {
this.right = node;
}
}
//当添加完一个节点后,如果:(右子树的高度-左子树的高度>1 就进行坐旋转)
if (righttHeight()-leftHeight()>1){
leftRotate();
}
}
测试!!
右旋转:当未进行右旋转时,测试一下
public static void main(String[] args) {
int arr[]=new int[]{10,12,8,9,7,6};
//创建一个AVLTree对象
AVLTree avlTree = new AVLTree();
//添加节点
for (int i=0;i
修改添加方法
// 添加节点的方法
// 递归添加节点,主义需要满足二叉排序树的要求
public void add(Node node){
if (node == null){
return;
}
if(this.value > node.value){
if (this.left != null){
this.left.add(node);
}else {
this.left = node;
}
}else { // 如果value相等 也走右边节点
if (this.right != null){
this.right.add(node);
}else {
this.right = node;
}
}
//当添加完一个节点后,如果:(右子树的高度-左子树的高度>1 就进行左旋转)
if (righttHeight()-leftHeight()>1){
leftRotate();
}
//当添加完一个节点后,如果:(左子树的高度-右子树的高度>1 就进行右旋转)
if (leftHeight()-righttHeight()>1){
rightRotate();
}
}
测试
public static void main(String[] args) {
int arr[]=new int[]{10,12,8,9,7,6};
//创建一个AVLTree对象
AVLTree avlTree = new AVLTree();
//添加节点
for (int i=0;i
输出
AVL树双旋转图解和实现修改测试用例以及测试结果
图解 修改Node中的add方法发现旋转后依旧不平衡
// 添加节点的方法
// 递归添加节点,主义需要满足二叉排序树的要求
public void add(Node node){
if (node == null){
return;
}
if(this.value > node.value){
if (this.left != null){
this.left.add(node);
}else {
this.left = node;
}
}else { // 如果value相等 也走右边节点
if (this.right != null){
this.right.add(node);
}else {
this.right = node;
}
}
//当添加完一个节点后,如果:(右子树的高度-左子树的高度>1 就进行左旋转)
if (righttHeight()-leftHeight()>1){
//如果它的右子树的左子树的高度大于它的右子树的右子树的高度
if (right!=null&&right.leftHeight()>right.righttHeight()){
//先对右子结点进行右旋转
right.rightRotate();
//然后对当前结点进行左旋转
leftRotate();
}else {
//直接进行左旋转即可
leftRotate();
}
return; //必须要有!!!*/
}
//当添加完一个节点后,如果:(左子树的高度-右子树的高度>1 就进行右旋转)
if (leftHeight()-righttHeight()>1){
//如果它的左子树的右子树大于它的左子树高度
if (left!=null&&left.righttHeight()>left.leftHeight()){
//先对当前结点的左结点(左子树)进行左旋转
left.leftRotate();
//再对当前结点进行右旋转
rightRotate();
}else {
//直接进行右旋转即可
rightRotate();
}
}
}
测试
public static void main(String[] args) {
int arr[]=new int[]{10,11,7,6,8,9};
//创建一个AVLTree对象
AVLTree avlTree = new AVLTree();
//添加节点
for (int i=0;i
输出
完整代码package avl;
public class AVLTreeDemo {
public static void main(String[] args) {
int arr[]=new int[]{10,11,7,6,8,9};
//创建一个AVLTree对象
AVLTree avlTree = new AVLTree();
//添加节点
for (int i=0;i node.value){
if (this.left != null){
this.left.add(node);
}else {
this.left = node;
}
}else { // 如果value相等 也走右边节点
if (this.right != null){
this.right.add(node);
}else {
this.right = node;
}
}
//当添加完一个节点后,如果:(右子树的高度-左子树的高度>1 就进行左旋转)
if (righttHeight()-leftHeight()>1){
//如果它的右子树的左子树的高度大于它的右子树的右子树的高度
if (right!=null&&right.leftHeight()>right.righttHeight()){
//先对右子结点进行右旋转
right.rightRotate();
//然后对当前结点进行左旋转
leftRotate();
}else {
//直接进行左旋转即可
leftRotate();
}
return; //必须要有!!!*/
}
//当添加完一个节点后,如果:(左子树的高度-右子树的高度>1 就进行右旋转)
if (leftHeight()-righttHeight()>1){
//如果它的左子树的右子树大于它的左子树高度
if (left!=null&&left.righttHeight()>left.leftHeight()){
//先对当前结点的左结点(左子树)进行左旋转
left.leftRotate();
//再对当前结点进行右旋转
rightRotate();
}else {
//直接进行右旋转即可
rightRotate();
}
}
}
// 中序遍历
public void infixOrder(){
if(this.left != null){
this.left.infixOrder();
}
System.out.print(this.value+" ");
if (this.right != null){
this.right.infixOrder();
}
}
//左旋转方法
private void leftRotate(){
//创建新的结点。以当前根节点的值
Node newNode = new Node(value);
//把新节点的左子树设置成当前结点的左子树
newNode.left=left;
//把新节点的右子树设置成当前结点的右子树的左子树
newNode.right=right.left;
//把当前结点的值替换成右子结点的值
value=right.value;
//把当前结点的右子树设置成当前结点的右子树的右子树
right=right.right;
//把当前结点的左子树(左子节点)设置成新的结点
left=newNode;
}
//右旋转方法
private void rightRotate(){
Node newNode = new Node(value);
newNode.right=right;
newNode.left=left.right;
value=left.value;
left=left.left;
right=newNode;
}
public Node search (int value){
if (value == this.value) { // 找到就是该节点
return this;
}else if (value < this.value){//如果查找的值小于当前结点,向左子树递归查找
if(this.left != null){
return left.search(value);
}else {
return null;
}
}else { //如果查找的值不小于当前结点,向右子树递归查找
if(this.right != null){
return this.right.search(value);
}else {
return null;
}
}
}
public Node searchParent(int value){
//如果当前结点就是要删除的结点的父节点,就返回
if (this.left != null && this.left.value == value){
return this;
}else if(this.right != null && this.right.value == value){
return this;
}else {
// 如果查找的值 小于当前节点的值 , 并且当前的节点左子节点不为空
if(value < this.value && this.left != null){
return this.left.searchParent(value);//向左子树递归查找
}else if(value >= this.value && this.right != null){
return this.right.searchParent(value);//向右子树递归查找
}else {
// 真的找不到了 没有父节点
return null;
}
}
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
", left=" + left +
", right=" + right +
'}';
}
}



