Бинарное дерево навигации - PullRequest
0 голосов
/ 01 марта 2019

Мне было интересно, какие функции я мог бы добавить в свой инструмент навигации Binary Tree в Python.Пожалуйста, помните, что я всего лишь студент AS, поэтому не стоит слишком усердно писать мой код.

class Node:

    Depth = 0
    Table = []
    Max = 0

    def __init__(self, depth, value):
        self.Value = value
        if len(str(self.Value)) > Node.Max:
            Node.Max = len(str(self.Value))
        self.Right = None
        self.Left = None
        self.Depth = depth

    def lor(self, place):
        if place <= self.Value:
            if self.Left is None:
                if self.Depth + 1 > Node.Depth:
                    Node.Depth = self.Depth+1
                self.Left = Node(self.Depth+1, place)
            else:
                self.Left.lor(place)

        elif place > self.Value:
            if self.Right is None:
                if self.Depth + 1 > Node.Depth:
                Node.Depth = self.Depth + 1
                self.Right = Node(self.Depth + 1, place)
            else:
                self.Right.lor(place)
        Node.Table = return_table(Node.Depth)

    def output(self):
        if self.Left is None and self.Right is None:
            print(self.Value, end=" ")
        else:
            if self.Left is not None:
                self.Left.output()
            print(self.Value, end=" ")
            if self.Right is not None:
                self.Right.output()

    def placeInTab(self, LR, prev_col):
        if LR == "L":
            reduc = 0
            while True:
                if Node.Table[self.Depth-1][prev_col - reduc] == "Y"*Node.Max:
                    self.ValidateLen()
                    Node.Table[self.Depth-1][prev_col - reduc] = str(self.Value)
                    self.index = prev_col - reduc
                    break
                else:
                    reduc += 1
        if LR == "R":
            reduc = 0
            while True:
                if Node.Table[self.Depth-1][prev_col + reduc] == "Y"*Node.Max:
                    self.ValidateLen()
                    Node.Table[self.Depth-1][prev_col + reduc] = str(self.Value)
                    self.index = prev_col + reduc
                    break
                else:
                    reduc += 1

    def PlaceLR(self):
        if self.Left is not None:
            self.Left.placeInTab("L", self.index)
            self.Left.PlaceLR()
        if self.Right is not None:
            self.Right.placeInTab("R", self.index)
            self.Right.PlaceLR()

    def placeStart(self):
        for self.index in range(len(Node.Table[0])):
            if Node.Table[0][self.index] == "Y"*Node.Max:
                self.ValidateLen()
                Node.Table[0][self.index] = str(self.Value)
                break

        self.PlaceLR()

    def ValidateLen(self):
        if len(str(self.Value)) < Node.Max:
            self.Value = ("0"*(Node.Max-len(str(self.Value))))+str(self.Value)


def create_table(depth, width, Max):
    table = []
    for rows in range(depth):
        temp_list = []
        for column in range(width):
            temp_list.append(" "*Max)
        table.append(temp_list)
    return table


def create_base(table, Max):
    switch = True
    for pos in range(len(table[0])):
        if switch is True:
            table[0][pos] = "Y"*Max
            switch = False
        else:
            switch = True
    return table


def Gen_Layers(table, Max):
    for prev_row in range(0, len(table)-1):
        y1f = False
        y1 = 0
        y2f = False
        y2 = 0
        for col in range(len(table[prev_row])):
            if y1f is False:
                if table[prev_row][col] == "Y"*Max:
                    y1 = col
                    y1f = True
            else:
                if table[prev_row][col] == "Y"*Max:
                    y2 = col
                    y2f = True

            if y2f is True and y1f is True:
                table[prev_row + 1][int((y1+y2)/2)] = "Y"*Max
                y1f, y2f = False, False
    return table


def return_table(depth):               
    table = Gen_Layers(create_base(create_table(depth,(2**depth)-1, Node.Max), Node.Max), Node.Max)
    table.reverse()
    return table


def format_table(table, Max):
    for x in range(len(table)):
        for y in range(len(table[x])):
            if table[x][y] == str("Y"*Max):
                table[x][y] = "_"*Max
    return table


def clean_table(table, Max):
    new_table = []
    for row in table:
        new_table.append([])
    for index in range(len(table[0])):
        for depth in range(len(table)):
            if table[depth][index] not in [" "*Max, "_"*Max]:
                for row in range(len(table)):
                    new_table[row].append(table[row][index])
    return new_table


x = [23, 54, 23, 5, 7, 5, 3, 34, 6, 5, 7, 32, 3, 23, 65, 43, 21]
start = Node(1, x[0])
for pos in range(1, len(x)):
    start.lor(x[pos])

start.output()
print("\nDepth:", Node.Depth)

print("\n\n")

start.placeStart()
Node.Table = format_table(Node.Table, Node.Max)
for x in Node.Table:
    print("".join(x))

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

Мне также интересно, есть ли более эффективный способ создания шаблона дерева.

...