查看 AVL 树没有给出正确的输出

View AVL tree not giving the correct output

我正在从事一个学校项目,该项目涉及实现具有插入删除和查看功能的 AVL 树。但是我的程序在查看具有前序遍历的 avl 树时没有给出正确的输出。

avl树的变量:

 typedef struct Node{
 int data;
 int height;
 struct Node *right;
 struct Node *left;
 }Node;

这是我的带有 newnode 函数调用的插入函数:

Node *newNode(int data){
Node *node = (Node*)malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
node->height = 1;
return(node);
}

Node *insertNode(Node *node, int data){
if(node == NULL)
    return(newNode(data));
if(data < node->data)
    node->left = insertNode(node->left, data);
if(data > node->data)
    node->right = insertNode(node->right, data);
if(data == node->data){
    printf("No duplicate allowed.");
    return node;
}

node->height = getHeight(node);
return(balancing(node, data));
}

使用 minvaluenode 函数调用删除函数:

Node * minValueNode(Node* node){
Node* current = node;

while (current->left != NULL)
    current = current->left;

return current;
}

Node *deleteNode(Node *root, int data){
 if(root == NULL){
    printf("Value not found.");
    return root;
}
else if ( data < root->data )
    root->left = deleteNode(root->left, data);
else if( data > root->data )
    root->right = deleteNode(root->right, data);
else if(data == root->data){
    if( (root->left == NULL) || (root->right == NULL) ){
        Node *temp = root->left ? root->left : root->right;
        if (temp == NULL){
            temp = root;
            root = NULL;
        }
        else
            *root = *temp;

        free(temp);
    }
    else{
        Node* temp = minValueNode(root->right);
        root->data = temp->data;
        root->right = deleteNode(root->right,temp->data);
    }
}
if(root == NULL)
    return root;
root->height = getHeight(root);
return(balancing(root, data));
}

使用 rotate、getbalancfactor、max 和 getheight 函数调用的平衡函数:

int max(int number1, int number2){
return (number1 > number2) ? number1 : number2;
}

int getHeight(Node* n) {
          return max(height(n->left), height(n->right)) + 1;
   }

int getBalanceFactor(Node *currentNode){
if(currentNode == NULL)
    return 0;
return height(currentNode->left) - height(currentNode->right);
}

Node *rightRotate(Node *currentNode){
Node *temp = currentNode->left;
currentNode->left = temp->right;
temp->right = currentNode;
temp->height =  getHeight(temp);
currentNode->height = getHeight(currentNode);
return temp;
}

Node *leftRotate(Node *currentNode){
Node *temp = currentNode->right;
currentNode->right = temp->left;
temp->left = currentNode;
temp->height =  getHeight(temp);
currentNode->height = getHeight(currentNode);
return temp;
}



Node *balancing(Node *node, int data){
    if(getBalanceFactor(node) >= 2 && data < node->left->data)

    return rightRotate(node);
if(getBalanceFactor(node) <= -2 && data > node->right->data)

    return leftRotate(node);
if(getBalanceFactor(node) >= 2 && data > node->left->data){
    node->left = leftRotate(node->left);
    return(rightRotate(node));
}
if(getBalanceFactor(node) <= -2 && data < node->right->data){
    node->right = rightRotate(node->right);
    return(leftRotate(node));
}
return node;
}

我的视图函数:

//print AVL Tree in preorder traversal
void printAVLTree(Node *root){
 if(root != NULL)
{
    printf("%d ", root->data);
    printAVLTree(root->left);
    printAVLTree(root->right);
}
}

我用随机插入输入进行了测试:

9 5 10 6 0 11 -1 1 2

调用视图函数时的输出为:

5 1 0 -1 2 9 6 10 11

正确的输出应该是:

9 1 0 -1 5 2 6 10 11

您的错误是您以错误的顺序(从上到下)更新了高度值:

temp->height =  getHeight(temp);
currentNode->height = getHeight(currentNode);

轮换后,下节点是currentNode所以你必须先更新它
否则,如果在更新 currentNode 之前更新 temptemp 将使用之前的 currentNode 高度值,并且会得到错误的高度