Обход двоичного дерева в Python

Я не думаю, что я обхожу его правильно, и он возвращается пустым, когда нужно вернуть новый список. Я застрял на некоторое время и все еще должен сделать все другие обходы. Будет предоставлять модульный тест для необходимого выхода, но мой модульный тест может быть неправильным.

def inorder(self):

    print("in INOrDER is entered")
    temp = [None]


    if self.__left:
        temp = temp.append(self.__left)
        return self.__left.inorder() 
    elif self.__right: 
        temp = temp.append(self.__right)
        return self.__right.inorder() 
    return temp


def test_inorder(self):
    bt = family_tree()
    bt.add(20, "melanie")
    bt.add(10, "edwin")
    bt.add(30, "junior")
    bt.add(25, "dora")
    bt.add(35, "kate")
    x = bt.inorder()

    expected = '''(10, 'edwin'),(20, 'melanie'),(25, 'dora'),(30, 'junior'),(35, 'kate')'''
    self.assertEquals(str(x), expected)
    t = family_tree(bt)
    self.assertEquals(str(t), expected)

2 ответа

Решение

В вашей реализации есть 2 проблемы:

temp = [None]

Вышеупомянутое утверждение создает список с None вещь:

x = len(temp) # x value will be 1

Вторая проблема - ваш метод, добавляющий логику; вы возвращаете значения, а не добавляете их.

Вот база реализации вашего кода:

def inorder(self):
    result = []
    if self.__left:
        result += self.__left.inorder()

    result.append(self.__value)

    if self.__right:
        result += self.__right.inorder()

    return result

Обход по порядку должен спускаться в оба поддеревья, если они присутствуют, и посещать корень между ними; Ваш код возвращается после обхода поддерева, пропуская другое поддерево и корень.

Другие вопросы по тегам