Попытка сохранить узел или ссылку на узел в списке - PullRequest
0 голосов
/ 04 августа 2020

У меня есть древовидный класс, в котором класс инициализируется атрибутами data, left и right. в том же классе у меня есть метод "сохранения". Я использую список как очередь. Я пытаюсь создать метод «сохранения», который принимает только один аргумент «данные». Цель этого метода сохранения - исключить из моего списка, проверить этот узел, чтобы увидеть, пуст ли он, и если это так, он сохраняет мои данные там. В противном случае он помещает в список 2 дочерних элемента этого узла. Целью этого является сохранение данных в дереве в порядке уровней. Поскольку класс инициализируется, в дереве всегда есть как минимум 1 элемент, который является узлом root.

Проблема, с которой я постоянно сталкиваюсь, заключается в том, что всякий раз, когда я добавляю self.data (узел root , а не данные, которые я сейчас пытаюсь добавить) в мой список в начале метода сохранения, он сохраняет только данные там. и, очевидно, когда я затем пытаюсь добавить левый и правый дочерние элементы этого int, я получаю сообщение об ошибке, потому что у int нет левых или правых атрибутов.

Мне интересно, как сохранить узел в списке вместо данные на узле.

class Tree():
    aqueue = []
    def __init__(self, item):
        self.item = item
        self.leftchild = None
        self.rightchild = None
        self.aqueue.append(self.item)
        
    def add(self, newitem):
        temp = self.myqueue.pop(0)
        if temp is None:
            temp = Tree(newitem)
        else:
            self.aqueue.append(temp.leftchild)
            self.aqueue.append(temp.rightcild)
            temp.add(newitem)
        
        self.aqueue.clear() #this is meant to clear queue of all nodes after the recursions are complete
        self.aqueue.append(self.item) #this is meant to return the root node to the queue so that it is the only item for next time

1 Ответ

0 голосов
/ 04 августа 2020

Есть пара очевидных проблем с вашим кодом: обе ветви if и else возвращаются, поэтому код после него никогда не запускается, temp == newitem - это выражение равенства, но даже если это было присвоение, оно не будет работать что угодно:

def add(self, newitem):
    temp = self.myqueue.pop(0)
    if temp == None:       # should use temp is None
        temp == newitem    # temp = newitem still wouldn't do anything
        return True
    else:
        self.aqueue.append(temp.leftchild)
        self.aqueue.append(temp.rightcild)
        return temp.add(newitem)
    
    # you will never get here, since both branches of the if returns
    self.aqueue.clear()            # delete everything in the list..?
    self.aqueue.append(self.item)
...