может кто-нибудь объяснить мне эту строчку - PullRequest
0 голосов
/ 09 июля 2020
class TreeNode:
    def __init__(self, data):
        self.data = data
        self.children = []
        self.parent = None

    def get_level(self):
        level = 0
        p = self.parent
        while p:
            level += 1
            p = p.parent

        return level

    def print_tree(self):
        spaces = ' ' * self.get_level() * 3
        prefix = spaces + "|__" if self.parent else ""
        print(prefix + self.data)
        if self.children:
            for child in self.children:
                child.print_tree()

    def add_child(self, child):
        child.parent = self
        self.children.append(child)

def build_product_tree():
    root = TreeNode("Electronics")

    laptop = TreeNode("Laptop")
    laptop.add_child(TreeNode("Mac"))
    laptop.add_child(TreeNode("Surface"))
    laptop.add_child(TreeNode("Thinkpad"))

    cellphone = TreeNode("Cell Phone")
    cellphone.add_child(TreeNode("iPhone"))
    cellphone.add_child(TreeNode("Google Pixel"))
    cellphone.add_child(TreeNode("Vivo"))

    tv = TreeNode("TV")
    tv.add_child(TreeNode("Samsung"))
    tv.add_child(TreeNode("LG"))

    root.add_child(laptop)
    root.add_child(cellphone)
    root.add_child(tv)

    root.print_tree()

if __name__ == '__main__':
    build_product_tree()

Я знаю значение self.parent, но кто-нибудь, пожалуйста, объясните это: p = p.parent и child.parent = self

1 Ответ

0 голосов
/ 09 июля 2020

Представьте, что у вас целая куча ведер. Красный - самый маленький, оранжевый - побольше, желтый - побольше, все цвета радуги.

Вы кладете красный внутрь апельсина, затем кладете оранжевый внутри желтого и так далее. Все ваши ведра теперь находятся внутри других ведер. Кроме фиолетового. Это самое большое ведро.

Теперь вы начинаете с красного ведра. Мы назовем это self. Нам нужен алгоритм, подсчитывающий, сколько существует корзин. Давайте создадим переменную счетчика с именем level.

Родителем красного ведра является оранжевое ведро, которое мы можем получить, используя p = self.parent. Теперь p относится к оранжевому ведру. Мы также хотим добавить 1 к нашему счетчику. Итак, мы делаем level += 1.

Прямо сейчас p - это оранжевое ведро. Но мы еще не закончили. Нам нужно выяснить, есть ли у оранжевого ведра родительский элемент. Мы запросим его родительский элемент и повторно используем ту же переменную p, сказав p = p.parent. После этого p становится желтым ведром. И снова добавляем единицу к уровню.

Продолжаем так, пока не дойдем до фиолетового ведра. Фиолетовое ведро - это самое дальнее ведро. Поэтому, когда мы спрашиваем у фиолетового ведра его родителя, мы не получаем ответа. Другими словами, когда p - фиолетовое ведро, а мы делаем p = p.parent, p больше не ведро!

Ну, мы выполняли цикл только до тех пор, пока p все еще ведро. В коде это бит, который говорит while p:. Итак, теперь мы прекращаем цикл, и наша переменная level сообщает нам, сколько контейнеров было.

child.parent = self сообщает ведру, куда следует go. Возьмем ведро еще больше. Черное ведро. Мы назовем это self. А еще мы получим фиолетовое ведро. Мы назовем это child. Теперь я хочу сказать фиолетовому ведру go черному ведру. child.parent = self.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...