Вставка бинарного дерева поиска в Python не возвращается в консоль - PullRequest
0 голосов
/ 02 сентября 2018

, изучая BST в hackerrank, я наткнулся на следующую проблему.

Мои классы для узла и для дерева двоичного поиска определены следующим образом:

class Node:
    def __init__(self,info):
        self.info = info
        self.left = None
        self.right = None

class BinarySearchTree:
    def __init__(self):
        self.root = None

    def insert(self,val):
        currentNode = self.root
        if currentNode is None:
            self.root = Node(val)
        elif currentNode.info > val:
            currentNode.left = insert(currentNode.left,val)
        elif currentNode.info < val:
            currentNode.right = insert(currentNode.right,val)
        return currentNode

Однако выполнение обхода tree = BinarySearchTree() после использования tree.insert(arr[i] над циклом for для некоторого массива целых чисел arr не возвращает вывода. Логика кажется мне правильной, и я подозреваю, что это связано с различием в типе между Node и BST, но я не уверен, как решить эту проблему.

Редактировать: ниже приведен полный код хакерранка. Единственный бит, который мне удалось отредактировать, - это функция вставки.

class Node:
    def __init__(self, info):
        self.info = info  
        self.left = None  
        self.right = None 
        self.level = None 

    def __str__(self):
        return str(self.info) 

def preOrder(root):
    if root == None:
        return
    print (root.info, end=" ")
    preOrder(root.left)
    preOrder(root.right)
    
class BinarySearchTree:
    def __init__(self): 
        self.root = None

    def insert(self,val):
        currentNode = self.root
        if currentNode is None:
            self.root = Node(val)
        elif currentNode.info > val:
            currentNode.left = insert(currentNode.left,val)
        elif currentNode.info < val:
            currentNode.right = insert(currentNode.right,val)
        return currentNode

tree = BinarySearchTree()
t = int(input())

arr = list(map(int, input().split()))

for i in range(t):
    tree.insert(arr[i])

preOrder(tree.root)

Данный тест был

6
4 2 3 1 7 6

и должен был вернуть 4 2 3 1 7 6, но выходные данные не возвращались.

Редактировать: внесены изменения в соответствии с первым ответом! Теперь у меня ошибка следующей недели:

Traceback (most recent call last):
    File “solution.py”, line 40, in <module>
        tree.insert(arr[i])
    File “solution.py”, line 30, in insert
        currentNode.left = insert(currentNode.left,val)
NameError: name ‘insert’ is not defined

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

измените свой код на

    def insert(self, val, currentNode):

        if self.root is None:
            self.root = Node(val)

        elif currentNode.info > val:
            if currentNode.left is None
                currentNode.left = Node(val)
            else:
                self.insert(val, currentNode.left)

        elif currentNode.info < val:

            if currentNode.right is None
                currentNode.right = Node(val)
            else:
                self.insert(val, currentNode.right)

и позвоните по номеру

 tree.insert(val,tree.root)
0 голосов
/ 02 сентября 2018

Вот несколько более короткая версия, которая позволяет избежать вложенных операторов if и без класса Node:

class BinarySearchTree:
    def __init__(self):
        self.info = None
        self.left = None
        self.right = None

    def insert(self,val):
        if self.info is None:
            self.info = val
            self.left = BinarySearchTree()
            self.right = BinarySearchTree()
        elif self.info > val:
            self.left.insert(val)
        elif self.info < val:
            self.right.insert(val)
0 голосов
/ 02 сентября 2018

Я думаю, что проблема заключается здесь

def insert(self,val):
    currentNode = self.root
    if currentNode is None:
        currentNode = Node(val)
    elif currentNode.info > val:
        currentNode.left = insert(currentNode.left,val)
    elif currentNode.info < val:
        currentNode.right = insert(currentNode.right,val)
    return currentNode

как видите, вы "вставляете" узел, но не назначаете его, кодовый блок

if currentNode is None:
    currentNode = Node(val) 

должно быть

if currentNode is None:
    self.root = Node(val)

вы продолжаете пытаться пройти через нулевое дерево

РЕДАКТИРОВАТЬ: Вполне возможно, что это не проблема, пожалуйста, предоставьте полный код, которого функция create() отсутствует в вашем коде, но называется

...