Methodenaufruf in Klassen, BinarySearchTree

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
alX1111
User
Beiträge: 6
Registriert: Donnerstag 22. April 2021, 18:02

Hallo zusammen!
Ich hätte eine kleine Anfängerfrage bzgl. folgendem Methodenaufruf auf einem erzeugten Objekt der Klasse TreeNode.
So funktioniert die Suche nach einem Element in meinem kleinen Test-Baum:

Code: Alles auswählen

class TreeNode:
    def __init__(self, val, left=None, right=None):
        self.value = val
        self.leftChild = left
        self.rightChild = right

def search(searchValue, node):
        if node is None:
            print("value not found!")
            return node
        elif node.value == searchValue:
            print("value found at:", node)
        elif searchValue < node.value:
            return search(searchValue, node.leftChild)
        else:
            return search(searchValue, node.rightChild)

node11=TreeNode(10)
node12=TreeNode(33)
node21=TreeNode(56)
node22=TreeNode(89)
node1 = TreeNode(25,node11,node12)
node2 = TreeNode(75,node21, node22)
root = TreeNode(50, node1, node2)

search(33, root)
Wenn ich allerdings die search-Methode einrücke und 'self' als erstes Argument übergebe und dann versuche die Methode über die Punktschreibweise auf dem Objekt 'root' aufzurufen, klappt das nicht mehr!
Allerdings check ich ehrlich gesagt auch gar nicht, was ich dann beim Parameter 'node' in der search-Methode beim Aufruf übergeben soll??
NameError: name 'search' is not defined

Code: Alles auswählen

class TreeNode:
    def __init__(self, val, left=None, right=None):
        self.value = val
        self.leftChild = left
        self.rightChild = right

    def search(self, searchValue, node):
            if node is None:
                print("value not found!")
                return node
            elif node.value == searchValue:
                print("value found at:", node)
            elif searchValue < node.value:
                return search(searchValue, node.leftChild)
            else:
                return search(searchValue, node.rightChild)

node11=TreeNode(10)
node12=TreeNode(33)
node21=TreeNode(56)
node22=TreeNode(89)
node1 = TreeNode(25,node11,node12)
node2 = TreeNode(75,node21, node22)
root = TreeNode(50, node1, node2)

root.search(33,root)
Vielen Dank für eine erhellende Antwort!
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@alX1111: Wenn Du aus der `search()`-Funktion eine `search()`-Methode machst, dann ist `self` ja das was vorher `node` war. `node` braucht man dann nicht mehr.

Der Code kann dann aber auch nicht so bleiben denn Du hast ein Problem mit einem leeren Baum. Der kann dann nicht durch `None` repräsentiert werden, denn `None` hat weder `search()` noch `value` oder `left_child` oder `right_child`.

Was auch bei der Funktion `search()` schon mindestens komisch, wenn nicht gar falsch ist, sind die ``return``\s. Entweder gibt die Funktion *immer* etwas zurück, oder sie gibt *nie* etwas zurück. Das Gemisch was da im Code steht macht jedenfalls keinen Sinn.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
alX1111
User
Beiträge: 6
Registriert: Donnerstag 22. April 2021, 18:02

Ok. Zum ersten Punkt:
Heisst das, dass ich dann in der Methode jedes 'node' durch ein 'self' ersetzen muss, wenn ich 'node' als Argument weglasse?
Das funktioniert nämlich auch nicht...
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@alX1111: Das funktioniert unter anderem nicht weil `self` niemals `None` sein kann. Noch mal: Wenn ein leerer (Teil)Baum durch `None` repräsentiert wird, dann kannst Du keine `search()`-Methode auf den Knoten haben, weil die auch auf einem leeren Baum existieren muss. Sonst ist die API ”unregelmässig” und mindestens der Aufrufer müsste das mit dem `None` wissen und entsprechend besonders behandeln. Und die `search()`-Methode muss entsprechend umgeschrieben werden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten