присвоение имени узлу дерева с использованием классов в Python - PullRequest
0 голосов
/ 25 мая 2020

как мне присвоить имя левому дочернему элементу левого дочернего элемента root? Я новичок в занятиях. последние две строки - это то место, где я пытаюсь выполнить задание. Помощь приветствуется!

class BinaryTree:
    def __init__(self,rootName):
        self.root = rootName
        self.leftChild = None
        self.rightChild = None

    def insertLeft(self,newNode):
        if self.leftChild == None:
            self.leftChild = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.leftChild = self.leftChild
            self.leftChild = t

    def insertRight(self,newNode):
        if self.rightChild == None:
            self.rightChild = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.rightChild = self.rightChild
            self.rightChild = t


    def getRightChild(self):
        return self.rightChild

    def getLeftChild(self):
        return self.leftChild

    def setRootVal(self,obj):
        self.root = obj

    def getRootVal(self):
        return self.root


r = BinaryTree('a')
r.leftChild = 'b'
r.rightChild = 'c'

r.insertLeft = BinaryTree('b')
r.insertRight = BinaryTree('c')


r.getLeftChild().leftChild = 'd' 
r.leftChild.leftChild = 'd'

оба последних оператора дают мне эту ошибку: объект 'str' не имеет атрибута 'getRootVal' Я пытаюсь создать дерево, которое выглядит следующим образом: enter image description here

1 Ответ

1 голос
/ 25 мая 2020

Глядя на интерфейс BinaryTree, вы должны вызывать insertLeft и insertRight для добавления дочерних элементов в дерево вместо:

r.leftChild = 'b'
r.rightChild = 'c'

leftChild и rightChild должны быть BinaryTree объектами, а не строками. Хотя вы могли бы написать:

r.leftChild = BinaryTree('b')
r.rightChild = BinaryTree('c')

Он не обрабатывает случай, когда leftChild и rightChild не None. Вот почему вы должны использовать insertLeft и insertRight, которые обрабатывают эти случаи за вас:

r.insertLeft('b')
r.insertRight('c')

Чтобы вставить d, e и f, мы делаем то же самое. способ, используя insertLeft и insertRight:

r.getLeftChild().insertRight('d')
r.getRightChild().insertLeft('e')
r.getRightChild().insertRight('f')
...