0

我找到了迭代添加新节点所需的代码,尽管它在我的情况下不起作用。

 // bal=left  jobb=right
void bkf::beszur(int k) {
    if(root != NULL) 
        while (true) {
            if (k < root->data) {
                if (root->bal == NULL) {
                    root->bal = new node;
                    root->bal->data = k;
                    root->bal->bal = NULL;
                    root->bal->jobb = NULL;
                    break;
                }
                else
                    root = root->bal;   // overwrites root
            }
            else 
                if (root->jobb == NULL) {
                    root->jobb = new node;
                    root->jobb->data = k;
                    root->jobb->bal = NULL;
                    root->jobb->jobb = NULL;
                    break;
                } else 
                    root = root->jobb;   // overwrites root
        }
    else {
        root = new node;
        root->data = k;
        root->bal = NULL;
        root->jobb = NULL;
    }
}

在“root = root->bal”处,根被覆盖,因此它也获取数据和 root->bal 的左右节点。我还尝试创建一个“节点 *p”,并为其分配 root,但这样它会为 p 本身分配内存,而不是 p 指向的位置。这是声明:

struct node {
    int data;
    node *bal;
    node *jobb;
};

class bkf {
    node *root;
    // ...

这是如何正确完成的?

4

2 回答 2

0

因为 root 是类级别的范围变量。制作根的本地副本,比如 root_local。

root_local = 根。

然后开始在函数中使用它。

当您执行 root = root-> bal 时。root 在类级别更改。

于 2013-07-05T10:47:32.643 回答
0

也许关键是您在树内进行遍历/插入之前不存储根节点。因此 root 是调用函数后的任意节点。

也许您应该在第一次函数调用之前存储根目录,以便始终拥有重新开始的入口点。

于 2013-07-05T10:44:43.977 回答