我正在做一个学校项目,该项目涉及实现带有插入和删除功能的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,getbalancefactor,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


调用view函数时的输出为:

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,因此您必须先对其进行更新。
否则,如果在更新temp之前更新currentNode,则temp将使用以前的currentNode height值,并且高度错误

关于c - 查看AVL树未提供正确的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57351963/

10-15 09:27