0

AVL ツリーを使用して学校のプロジェクトを完了しようとしています。何が起こるかというと、ルートと他の 2 つのノードを挿入すると、すべて問題なく動作しますが、これらの 3 つ以上のノードを追加しようとすると、プログラムが失敗します。問題は、newnode のポインターが作成された後、センチネル NIL を指していないことにあると考えました。NILを指すnewnodeのポインタを設定しようとしましたが、うまくいきませんでした。
どうすればこれを修正できますか?

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cmath>
#include <stdio.h>
#include "graphvisualize.h"

using namespace std;
typedef struct node Tnode;

Tnode *root;
Tnode *NIL;
Tnode *newnode;

void InitializeTree(int k) {
    //initialize the list with the root node
    NIL=(Tnode *)malloc(sizeof(Tnode));  
    root=(Tnode *)malloc(sizeof(Tnode));
    //change to null later
    root->value = k;
    root->parent = NIL;
    root->right = NIL;
    root->left = NIL;  
    root->height = 1;
    NIL->right = NULL;
    NIL->left = NULL;
    NIL->parent = NULL;
}

void insert(int v) {
    Tnode *newnode=(Tnode *)malloc(sizeof(Tnode));
    newnode->value = v;
    Tnode *y = NIL;
    Tnode *x = root;
    while(x != NIL) {
        y = x;
        if(newnode->value < x->value) {
            x = x->left;  
        } else {
            x = x->right;   
        }
        newnode->parent = y;
        if(y == NIL) {
            root = newnode;
        } else if(newnode->value < y->value) {
            y->left = newnode;          
        } else {
            y->right = newnode;
        }
        cout << "insert  ";
        //Heres my problem
        //trying to set right and left pointer to NIL
        newnode->left = NIL;
        newnode->right = NIL;         
    }

    //height manager
    int h = 1;
    newnode->height = h;
    while((newnode->parent != NIL)  &&  (newnode->height >= newnode->parent->height)) {
        newnode = newnode->parent;
        newnode->height++;
    }
    cout << "height-fix  ";
}

//Display AVL Tree
void ViewTree() {
    ofstream AVLfile;
    AVLfile.open("AVLgraphfile.dot");
    AVLfile << visualize_tree(root);
    AVLfile.close();
}

int main() {
    InitializeTree(7);
    cout << "root  ";
    insert(5);
    insert(8);
    //insert(6); 
    ViewTree();
    return 0;
}
4

0 に答える 0