#include "BinarySearchTree.h"

using namespace std;

Node * walk_tree(string key, Node *n) {
    if (n->get_key() == key)
        return n;
    if (n->get_key() > key) {
        if (n->get_left_child() != NULL)
            return walk_tree(key, n->get_left_child());
        return n;
    }
    if (n->get_right_child() != NULL)
        return walk_tree(key, n->get_right_child());
    return n;
}

Node * BinarySearchTree::search(string key) {
    if (this->root == NULL)
        return NULL;
    Node * t_node = walk_tree(key, this->root);
    if (t_node->get_key() != key)
        return NULL;
    else
        return t_node;
}

int BinarySearchTree::insert(string key) {
    if (this->root == NULL) {
        Node * new_node = new Node(key);
        this->root = new_node;
        return 0;
    }
    if (BinarySearchTree::search(key) != NULL)
        return 0;
    Node * t_node = walk_tree(key, this->root);
    t_node->insert(key);
    return 0;
}

void inOrderTreePrint(Node *n) {
    if (n != NULL) {
        inOrderTreePrint(n->get_left_child());
        cout << n->get_key() << ", ";
        inOrderTreePrint(n->get_right_child());
    }
}

void BinarySearchTree::list() {
    cout << "All keys in ascending order:" << endl;
    inOrderTreePrint(this->root);
    cout << "(end)" << endl; 
    // mit der inOrderTreePrint Methode fällt mir gerade kein
    // eleganter Weg ein, um das letzte Komma weglassen zu können.
    // also füge ich das "(end)" am Ende hinzu, damit es zumindest nicht
    // so unvollständig aussieht.
}

void delete_rec(Node * n) {
    if (n->get_left_child() != NULL)
        delete_rec(n->get_left_child());
    if (n->get_right_child() != NULL)
        delete_rec(n->get_right_child());
    delete n;
}

BinarySearchTree::~BinarySearchTree() {
    if (this->root == NULL)
        return;
    delete_rec(this->root);
}
