在BST中插入节点时发生逻辑错误

时间:2019-04-26 19:51:20

标签: c++ tree

我已经为BST编写了一个节点插入代码。但是它似乎无法正常工作。它给出了“细分错误”。这是我的插入逻辑。

    char a = ' ';
    int m = a* 10;
    System.out.println(m);

我该如何解决?谢谢

编辑:所以我尝试了一些方法,而这个就可以了

    void insert(Node* root, int data){
     if(root==NULL){
      root= new Node;
      root->data = data;
      }
    else if(data < root->data){
      insert(root->left,data);
      }
    else if(data> root->data){
      insert(root->right,data);
      }
    }

Node * root和Node *&root有什么区别?

1 个答案:

答案 0 :(得分:1)

好吧,如果节点不存在(它是NULL),那么您只是将root的指针设置为new Node,但是却缺少“挂断”的功能给它的父母如前所述,自unique_ptr起,您可以使用C++11 -s来避免内存泄漏(那是您忘记删除对象的时候)。看起来像:

struct Node {
    int data = -1;  // not initialized
    std::unique_ptr<Node> l;
    std::unique_ptr<Node> r;
}

void insert(Node *root, int data) {
    if (root->data == -1) {
        root->data = data;
        return;
    }
    if (data < root->data) {
        if (!root->l) {
            // hanging new left node up
            root->l = std::make_unique<Node>();  // std::make_unique comes since C++14
        }
        insert(root->l.get(),  // getting raw ptr
               data);
    }
    else {
        if (!root->r) {
             // hanging new right node up
             root->r = std::make_unique<Node>();
        }
        insert(root->r.get(), data);
    }
}

此外,您可能会对称为treap的数据结构感兴趣,因为如果您插入例如增加序列号,则您的实现可能会花费很长时间:

Node root;

for (int i = 1; i <= 100'000; i++) {
    insert(&root, i);
}

所以在这种情况下,您的二叉树看起来像:

1
 \                  
  2                 <=
   \                <= very long path
    3               <=
     \
     ...
       \
     100'000

重击有助于避免BST中的路径过长。