【问题标题】:Binary tree doesn't inserting二叉树不插入
【发布时间】:2022-01-14 20:05:41
【问题描述】:

我必须使用多态性编写一个集合 - 二叉树。它的根必须是抽象类的对象。我有类 Node 和 Btree,但函数“add”不能正常工作。我究竟做错了什么..?请帮忙

class Node {
public:
    Node() {
        o = nullptr;
        left = nullptr;
        right = nullptr;
    }
    Node(object* obj) {
        o = obj;
        left = nullptr;
        right = nullptr;
    }
    friend class Btree;
private:
    object *o;
    Node *left;
    Node *right;
};
class Btree {
public:
Btree() {
    count = 0;
    root = nullptr;
}
void deleteNotes(Node *n) {
    if (!n) return;
    delete n;
    delete n->left;
    delete n->right;
}
Node* getRoot() {
    return root;
}
Node* getLeft(Node* n) {
    return n->left;
}
Node* getRight(Node* n) {  
    return n->right;
}
object* getData(Node *n) {
    return n->o;
}
void add(object *obj) {
    Node *n = new Node;
    n->o = obj;
    if (!n) {
        return;
    }
    insertNode(root, n);
}
void insertNode(Node *node, Node *elem) {
    if (node == nullptr) node = elem;
    else {
        if (equal(node->o, elem->o) < 0) 
            insertNode(node->left, elem);
        else insertNode(node->right, elem);
    }
}
Node *search(object *obj) {
    return searchNode(root, obj);
}
Node *searchNode(Node *node, object *obj) {
    if (equal(node->o, obj) == 0) return node;
    else {
        if (equal(node->o, obj) < 0) {
            searchNode(node->left, obj);
        }
        else {
            searchNode(node->right, obj);
        }
    }
}
void show() {
    showNode(root);
}
void showNode(Node *n) {
    if (n != nullptr) {
        showNode(n->left);
        cout << n->o->uploadInString() << "\n";
        showNode(n->right);
    }
}
void deleteNodes(Node *n) {
    if (!n) return;
    delete n;
    delete n->left;
    delete n->right;
}
~Btree() {
    deleteNodes(root);
}
private:
int count;
Node *root;
};

我有两种数据类型——整数和日期作为“对象”类的子类。我不知道我应该写哪些细节............

【问题讨论】:

  • “无法正常工作。” -- 这涵盖了add 函数导致全球火山爆发激增的情况。换句话说,这种描述是没有用的。为什么你认为它不起作用?有什么症状?如果不是编译时错误或崩溃,那么简单测试用例的预期结果和实际结果是什么?
  • “我不知道我应该写哪些细节” -- 你应该写足够的细节,以便有人可以从你的问题中复制代码,将该代码提供给编译器,并重现您的结果。您还应该争取足够的最少代码量。 (这被称为minimal reproducible example。)

标签: c++ binary-tree abstract-class


【解决方案1】:

这里有个问题:

void insertNode(Node *node, Node *elem) {
  if (node == nullptr) node = elem;
  else {
  ...
  }
}

第一次尝试添加节点时,node 等于 root,因此等于 nullptr。所以这个函数设置node等于elem,然后退出。 但是node是一个局部变量,它属于函数。函数修改了变量的值,然后函数退出,变量被遗忘了。 root 的值仍然是 nullptr

有几种方法可以解决这个问题。这是一个:

Node* insertNode(Node *node, Node *elem) {
  if (node == nullptr) return elem;

  if (equal(node->o, elem->o) < 0)
    node->left = MyInsertNode(node->left, elem);
  else node->right = MyInsertNode(node->right, elem);

  return node;
}

void add(object *obj) {
  ...
  root = insertNode(root, n);
}

还有其他问题。我建议你在尝试树之前多做一些简单的练习(例如链表)。

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 2019-08-26
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2016-05-09
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多