二叉树不插入
Binary tree doesn't inserting
我要写一个集合——二叉树,使用多态性。它的根必须是抽象对象class。我有 class 个 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;
};
我有两种数据类型——整数和日期作为 class“对象”的子项。不知道应该写哪些细节.......
这里有一个问题:
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);
}
还有其他问题。我建议您在尝试树之前,再做一些更简单的练习(例如链表)。
我要写一个集合——二叉树,使用多态性。它的根必须是抽象对象class。我有 class 个 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;
};
我有两种数据类型——整数和日期作为 class“对象”的子项。不知道应该写哪些细节.......
这里有一个问题:
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);
}
还有其他问题。我建议您在尝试树之前,再做一些更简单的练习(例如链表)。