QPainter und Binary Search Tree

Alles rund um die Programmierung mit Qt
Antworten
p3p3
Beiträge: 1
Registriert: 24. Mai 2017 13:33

QPainter und Binary Search Tree

Beitrag von p3p3 »

Guten Tag allerseits

Ich möchte den Binary Search Tree "graphisch" mit der Library QPainter abbilden/zeichnen. Den Code für das Anhängen von Nodes, je nach Grösse der Value steht soweit. Ich benötige hier auch keinen fertigen Code - es geht mir lediglich um eine Verständnisfrage resp. um ein Ansatz, wie dies durchgeführt/aufgebaut werden soll... Hier die Ausgangslage:

Über mein main adde ich eine Value zu meinem Tree:

Code: Alles auswählen

#include "tree.h"
#include "node.h"
#include <QApplication>

int main(int argc, char **argv)
{
    QApplication a(argc, argv);

    Tree w;     //Tree Objekt
    w.add(10);
    w.add(15);
    w.add(12);
    w.add(2);
    w.add(23);
    w.show();

    return a.exec();
}
Jedes Tree besitzt ein Root-Node. Jeder Node ein linker und rechter Arm.

Code: Alles auswählen

#ifndef TREE_H
#define TREE_H

#include <QWidget>
#include "node.h"

class Tree : public QWidget
{
    Q_OBJECT
private:
    int value;
    Node *root;
public:
    explicit Tree(QWidget *parent = 0);
    void add(int);
    void setValue(int);
    int getValue();
    ~Tree();
};

#endif // TREE_H

Tree::Tree(QWidget *parent) : QWidget(parent)
{
    root = nullptr;            //set root to null, it's empty at creation
}

void Tree::add(int v)   //add value
{
    Node *node = new Node(v);

    if(root == nullptr){        //if root is empty, set value of root
        this->root = node;            // create root-node with value
    } else {
        this->root->addNode(node);
    }

}

Der Baum wird durchgegangen & am richtigen Ort dann der entsprechende Node "dynamisch" erstellt.

Code: Alles auswählen


Node::Node(int v)
{
    this->value = v;
    this->left = nullptr;
    this->right = nullptr;
}

void Node::addNode(Node *n)
{
    // if value is less than this-value (actual node), set left

    if(n->value < this->value){

    // create on left side, check if left is empty
                if(this->left == nullptr){
                    this->left = n;
                } else {
                    this->left->addNode(n);
                }

            //check if right is empty
     } else if (n->value > this->value){
                if(this->right == nullptr){
                    this->right = n;
                } else {
                    this->right->addNode(n);
                }
        }

}

Nun zu meiner Frage. Ich will für jeden Methoden-Aufruf "add" (aus dem main) ein Node zeichnen und diesen mit einer Linie verbinden. Wo binde ich nun den QPainter ein? In die Node-Klasse (child), damit beim Konstruieren des Nodes dieses gleich gezeichnet werden kann? Oder kann z.B. aus dem Konstruktor heraus die paintEvent-Methode aufgerufen werden? oder update()? Oder gehört die QPaint-Angabe doch in die Tree-Klasse (parent)?

Wie ihr seht, steh ich zurzeit vor einer Wand... vermutlich lässt sich das ganze einfacher bauen, als ich denke. Bitte beachtet, dass ich keinen Code-Schnippsel benötige. Mir reichen zwei/drei Sätze. Wo würdet ihr die Paint-Methode einsetzen? wie würdet ihr weiter vorgehen?

Danke euch!
Gruss,
p3p3
Antworten