функция возвращает None (python)

переменная x в методе search становится None, хотя на момент return self точно не None

    def delete(self, val):
        arr = []
        x = Tree.search(self, val)

        def collectVal(x, arr):
            if x is not None:
                if x.left is not None:
                    arr.append(x.left.val)
                    collectVal(x.left, arr)
                if x.right is not None:
                    arr.append(x.right.val)
                    collectVal(x.right, arr)
            return arr

        arr = collectVal(x, arr)
        print(arr)

    def search(self, val):
        if self.val == val:
            print("Success!", val, "найдено!")
            return self
        else:
            if val < self.val:
                if self.left is not None:
                    self.left.search(val)
                else:
                    print(val, "not found!")

            elif val > self.val:
                if self.right is not None:
                    self.right.search(val)
                else:
                    print(val, "not found!")

Ответы (1 шт):

Автор решения: Дмитрий

Насколько я вижу по коду функции вам необходимо найти точное совпадение:

def search(self, val):
    if self.val == val:
        print("Success!", val, "найдено!")
        return self
    else:
        print(val, "not found!")
        return self

в любом случае будет возвращено само значение объекта, но с точки зрения полезности я бы возвращал True/False. Здесь все зависит от требований. И так как над объектом класса не проводятся никакие действия, то и возвращать self смысла нет

def search(self, val):
    if self.val == val:
        print("Success!", val, "найдено!")
        return True
    else:
        print(val, "not found!")
        return False

UPD: по условиям сам класс:

class Tree:

def __init__(self, val):

    self.left = None
    self.right = None
    self.val = val

def search_insert(self, val):

    if self.val:
        if val < self.val:
            if self.left is None:
                self.left = Tree(val)
            else:
                self.left.search_insert(val)
        elif val > self.val:
            if self.right is None:
                self.right = Tree(val)
            else:
                self.right.search_insert(val)
    else:
        self.val = val

def collectVal(self, obj):
    result = []
    if obj:
        result = self.collectVal(obj.left)
        result.append(obj.val)
        result = result + self.collectVal(obj.right)
    return result

пример вызова:

>>> from p import Tree as t
>>> r = t(20)
>>> r.search_insert(30)
>>> r.search_insert(24)
>>> r.search_insert(60) 
>>> r.search_insert(45)
>>> r.search_insert(1)  
>>> r.collectVal(r)     
[1, 20, 24, 30, 45, 60]

надеюсь это поможет

→ Ссылка