Не отображается вывод при вставке узла в BST - PullRequest
0 голосов
/ 02 января 2019

Я хочу вставить «новый» узел в двоичное дерево поиска.Но при выполнении кода я либо получаю такие ошибки, как:

an infinte loop (with nothing as display) 
 temp.data(nonetype) has no value. 

Можете ли вы увидеть, что является ошибкой в ​​этом коде и как ее исправить.

Пожалуйста, посмотрите мой следующий код:

class Node:
    def __init__(self,data=0):
        self.data = data
        self.left = None
        self.right = None
class tree:
    def __init__(self):
        self.root = None
    def insert(self,data):
        temp = root
        new_node = Node(data)
        new_node.left = None
        new_node.right =None
        while temp.left and temp.right:
            if new_node.data < temp.data:
                temp  = temp.left
            else:
                temp = temp.right
        if temp.data > new_node.data:
            temp.left = new_node
        else:
            temp.right = new_node
    def display(self,temp):
        if temp == None:
            return
        else:
            print(temp.data,end = " ")
            self.display(temp.left)
            self.display(temp.right)        
if __name__=='__main__':
    mylist = tree()
    root = Node(19)
    root.left =Node(12)
    root.right = Node(30)
    mylist.insert(10)
    mylist.display()

1 Ответ

0 голосов
/ 02 января 2019

Ваш код не учитывается, когда узел имеет только левое или правое поддерево.Выполняя итерацию по узлам, вы должны проверить, является ли ваш левый или правый дочерний элемент типом None или нет.
Я изменил класс дерева, чтобы инициализировать корень в конструкторе.Модифицированный код:

class Node:
    def __init__(self,data=0):
        self.data = data
        self.left = None
        self.right = None
class tree:
    def __init__(self,root):
        self.root = root
    def insert(self,data):
        temp = self.root
        new_node = Node(data)
        new_node.left = None #remove this as it will be set to none in Node constructor itself. 
        new_node.right =None #remove this
        while temp.left or temp.right:
            if new_node.data < temp.data:
                if temp.left != None:
                    temp  = temp.left
                else:
                    break
            else:
                if temp.right !=None:
                    temp = temp.right
                else:
                    break

        if temp.data > new_node.data: 
            temp.left = new_node                   
        else:
            temp.right = new_node
    def display(self,temp):
        if temp == None:
            return
        else:
            print(temp.data,end = " ")
            self.display(temp.left)
            self.display(temp.right)        
if __name__=='__main__':    
    root = Node(19)
    #root.left =Node(12) #insert using insert function of tree class
    #root.right = Node(30) 
    mylist = tree(root)
    mylist.insert(12)
    mylist.insert(30)
    mylist.insert(10)
    mylist.insert(20)
    mylist.insert(18)
    mylist.insert(9)
    mylist.display(root)
...