简体   繁体   English

具有3个值的C ++二叉树

[英]C++ Binary Tree With 3 Values For Struct

So I am attempting to create a binary search tree that stores an ID (T value) an age (int age) and a name (string) per each "bubble" located within the tree and is sorted by the ID. 因此,我试图创建一个二叉搜索树,该树存储一个ID (T value) ,年龄(int age)和名称(string) ,每个ID位于该树中,每个“气泡”并按ID排序。

For some reason, I cannot get my code to correctly store all 3 values as 1 structure per node. 由于某种原因,我无法使我的代码正确地将所有3个值存储为每个节点1个结构。 Is there something I am doing wrong? 我做错什么了吗?

Here's my code. 这是我的代码。

#ifndef _TREE_GUARD 
#define _TREE_GUARD 1

#include <iostream>
#include <math.h>
using namespace std;

template <class T>
struct Node {
    T value;
    int age;
    string name;
    Node *left;
    Node *right;

    Node(T val) {
        this->value = val;
    }

    Node(T val, int age, string name, Node<T> left, Node<T> right) {
        this->value = val;
        this->age = age;
        this->name = name;

        this->left = left;
        this->right = right;
    }
};

template <class T>
class BST {

private:
    Node<T> *root;

    void addHelper(Node<T> *root, T val) {
        if (root->value > val) {
            if (!root->left) {
                root->left = new Node<T>(val);
            }
            else {
                addHelper(root->left, val);
            }
        }
        else {
            if (!root->right) {
                root->right = new Node<T>(val);
            }
            else {
                addHelper(root->right, val);
            }
        }
    }

    void printHelper(Node<T> *root) {
        if (!root) return;
        printHelper(root->left);
        cout << root->value << ' ';
        cout << root->age << ' '; // ADDED
        cout << root->name << ' '; //ADDED
        printHelper(root->right);
    }

    int nodesCountHelper(Node<T> *root) {
        if (!root) return 0;
        else return 1 + nodesCountHelper(root->left) + nodesCountHelper(root->right);
    }

    int heightHelper(Node<T> *root) {
        if (!root) return 0;
        else return 1 + max(heightHelper(root->left), heightHelper(root->right));
    }

    void printMaxPathHelper(Node<T> *root) {
        if (!root) return;
        cout << root->value << ' ';
        if (heightHelper(root->left) > heightHelper(root->right)) {
            printMaxPathHelper(root->left);
        }
        else {
            printMaxPathHelper(root->right);
        }
    }

    bool deleteValueHelper(Node<T>* parent, Node<T>* current, T value) {
        if (!current) return false;
        if (current->value == value) {
            if (current->left == NULL || current->right == NULL) {
                Node<T>* temp = current->left;
                if (current->right) temp = current->right;
                if (parent) {
                    if (parent->left == current) {
                        parent->left = temp;
                    }
                    else {
                        parent->right = temp;
                    }
                }
                else {
                    this->root = temp;
                }
            }
            else {
                Node<T>* validSubs = current->right;
                while (validSubs->left) {
                    validSubs = validSubs->left;
                }
                T temp = current->value;
                current->value = validSubs->value;
                validSubs->value = temp;
                return deleteValueHelper(current, current->right, temp);
            }
            delete current;
            return true;
        }
        return deleteValueHelper(current, current->left, value) ||
            deleteValueHelper(current, current->right, value);
    }

public:

    void insert(T val) {
        if (root) {
            this->addHelper(root, val);
        }
        else {
            root = new Node<T>(val);
        }
    }

    void print() {
        printHelper(this->root);
    }

    int nodesCount() {
        return nodesCountHelper(root);
    }

    int height() {
        return heightHelper(this->root);
    }

    void printMaxPath() {
        printMaxPathHelper(this->root);
    }

    bool Delete(T value) {
        return this->deleteValueHelper(NULL, this->root, value);
    }
};
#endif

I created the struct using these 3 values, and a pointer to a right and left node, however, all my other functions don't seem to work with the age and name values, only the ID. 我使用这3个值以及指向左右节点的指针创建了结构,但是,我的所有其他功能似乎都不适用于age和name值,而只能使用ID。 This is most problamatic in my add and print function. 这是我addprint功能中最常见的问题。

I'm relatively new to C++, so any help would be appreciated. 我是C ++的新手,所以可以提供任何帮助。

EDIT: I'm assuming my problem lies around here somewhere. 编辑:我假设我的问题就在这里某个地方。 The code runs just fine, but it doesn't add the age and name to the string, and I can't properly print these values, just the ID 该代码可以正常运行,但不会在字符串中添加年龄和名称,而且我无法正确打印这些值,仅显示ID

 Node<T> *root;

    void addHelper(Node<T> *root, T val) {
        if (root->value > val) {
            if (!root->left) {
                root->left = new Node<T>(val);
            }
            else {
                addHelper(root->left, val);**
            }
        }
        else {
            if (!root->right) {
                root->right = new Node<T>(val);
            }
            else {
                addHelper(root->right, val);
            }
        }
    }

and here 和这里

void printHelper(Node<T> *root) {
        if (!root) return;
        printHelper(root->left);
        cout << root->value << ' ';
        cout << root->age << ' '; // ADDED
        cout << root->name << ' '; //ADDED
        printHelper(root->right);
    }

Thanks in advance! 提前致谢!

root->left = new Node(val); root-> left = new Node(val);

root->right = new Node(val); root-> right = new Node(val);

It seems that you create a new node and only give it a "val", no age, no name etc, so it only has the value. 看来您创建了一个新节点,只给它一个“ val”,没有年龄,没有名字等,因此它仅具有值。

edit: I never used "Template" before, so it took me a while to figure it out. 编辑:我以前从未使用过“模板”,所以花了我一段时间才弄清楚。 Anyways... 无论如何...

Solution: When you insert a node, you need to copy all the information, not just the "value", otherwise you'll only get the "value". 解决方案:插入节点时,您需要复制所有信息,而不仅仅是“值”,否则,您将只获得“值”。

void addHelper(Node<T> *root, Node<T>* n) {
    if (root->value > n->value) {
        if (!root->left) {
            root->left = new Node<T>(n->value,n->age,n->name,NULL,NULL);
        }
        else {
            addHelper(root->left, n);
        }
    }
    else {
        if (!root->right) {
            root->right = new Node<T>(n->value,n->age,n->name,NULL,NULL);
        }
        else {
            addHelper(root->right, n);
        }
    }
}

Also in "insert": 也在“插入”中:

void insert(Node<T>* n) {
    if (root) {
        this->addHelper(root, n);
    }
    else {
        root = new Node<T>(n->value,n->age,n->name,NULL,NULL);
    }
}

Several other things you may try and see the difference: 您可以尝试其他几件事,看看有什么不同:

I would initialize *root to be NULL, otherwise it may be some random stuff, and sometime I got seg fault because of that. 我会将* root初始化为NULL,否则可能是一些随机的东西,有时我会因此而出现段错误。

class BST {

private:
    Node<T> *root=NULL;

If the node you're about to insert has the same "value" with an already existing node, what do you do? 如果要插入的节点与已经存在的节点具有相同的“值”,该怎么办? Your program will just add it to the right. 您的程序只会将其添加到右侧。 I don't know if that's what you want, but that's what it will do. 我不知道那是不是您想要的,但这就是它的作用。

I tested with this and it worked. 我对此进行了测试,并成功了。 Hope it will work for you, too. 希望它也对您有用。

int main(){
    BST<int> tree;
    Node<int> node1(1,10,"test1",NULL,NULL);
    Node<int> node2(5,50,"test2",NULL,NULL);
    Node<int> node3(3,30,"test3",NULL,NULL);
    Node<int> node4(3,30,"test4",NULL,NULL);
    Node<int> node5(3,30,"test5",NULL,NULL);
    Node<int> node6(8,80,"test5",NULL,NULL);
    tree.insert(&node1);
    tree.insert(&node2);
    tree.insert(&node3);
    tree.insert(&node4);
    tree.insert(&node5);
    tree.insert(&node6);
    tree.print();
    cout<<endl;
    return 0;
}

output: 输出:

1 10 test1 3 30 test3 3 30 test4 3 30 test5 5 50 test2 8 80 test5 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM