c++ 如何用NLR方法插入树的数据

7jmck4yq  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(90)

我有一个关于插入树的数据并通过NLR方法打印出来的C++代码。但是在插入数据之后,我不能使用菜单中的命令2打印树。
我知道这个问题是在“insertTree”的某个地方,但我不知道如何修复它

struct node {
    int data;
    node* left;
    node* right;
};
void insertTree(node* t, int x) {
    //if the node to add is root
    if (t->data == NULL) {
        node* p = new node();
        p->data = x;
        p->left = NULL;
        p->right = NULL;
        t = p;
    }
    else {
        //if the added element is less than t
        if (t->data > x) {
            insertTree(t->left, x);//add the element to the left of t
        }
        else if(t->data < x) {
            insertTree(t->right, x);//add the element to the left of t
        }
    }
}
void duyet_NLR(node* t) {
    if (t->data != NULL) {
        cout << t->data << " ";
        duyet_NLR(t->left);
        duyet_NLR(t->right);
        system("pause");
    }
}
lb3vh1jj

lb3vh1jj1#

程序中至少存在两个(或三个)大问题:

  • 所有检查if (t->data == NULL)if (t->data != NULL)的检查都是错误的。需要检查**t**是否为空指针。t->dataint,不应与NULL进行比较。另外,不要在C++中使用NULL。使用nullptr。在这种情况下,它会帮助您,因为如果您使用nullptr而不是NULL,程序将无法编译。
  • insertTree中的node*t是函数的本地值。您对它所做的任何更改对函数的调用者(即在menu中)都不可见。这可以通过引用指针来改变:
void insertTree(node*& t, int x)  // note a reference to the pointer
  • menu中也存在上述问题。当menu返回到main时,main中的指针仍然是空指针-所以你不能删除所有的节点。在这里做同样的修改:
void menu(node*& t)

使用递归来插入节点可能不是问题,但是您可以通过在insertTree中循环找到插入点来避免这个问题。示例:

void insertTree(node*& t, int x) {
    node** next = &t;

    while(*next) { // loop until a leaf node is found
        if((*next)->data > x) next = &(*next)->left;
        else if((*next)->data < x) next = &(*next)->right;
        // this value already exists in the tree
        else return;
    }

    // *next is here a null pointer so that's where we'll insert the new node
    *next = new node{x, nullptr, nullptr};
}

Demo
您还需要添加一个函数来释放所有分配的内存。

相关问题