Допустим, пользователь задал список ребер как
ребра = [[3,2], [3,4], [4,5]]
root = 2
Во-первых, мы должны преобразовать список ребер в правильный словарь , который укажет древовидную структуру заданных ребер. Ниже приведен код, который я нашел на StackOverflow .
def createDict(edges, root):
graph ={}
for x,y in es:
graph.setdefault(x,set()).add(y)
graph.setdefault(y,set()).add(x)
tree, stack = {}, [s]
while stack:
parent = stack.pop()
children = graph[parent] - tree.keys()
tree[parent] = list(children)
stack.extend(children)
for i in tree.keys():
if tree[i] == []: #if the node is leaf node, give it a 0 val
tree[i].append(0)
return tree
Вывод будет: дерево = {2: [3], 3: [4], 4: [5], 5: [0]}
Теперь мы превратим его в древовидную структуру, используя класс Node . Этот код написан мной.
class Node:
def __init__(self, val):
self.val = val
self.children = []
def createNode(tree, root,b=None, stack=None):
if stack is None:
stack = [] #stack to store children values
root = Node(root) #root node is created
b=root #it is stored in b variable
x = root.val # root.val = 2 for the first time
if len(tree[x])>0 : # check if there are children of the node exists or not
for i in range(len(tree[x])): #iterate through each child
y = Node(tree[x][i]) #create Node for every child
root.children.append(y) #append the child_node to its parent_node
stack.append(y) #store that child_node in stack
if y.val ==0: #if the child_node_val = 0 that is the parent = leaf_node
stack.pop() #pop the 0 value from the stack
if len(stack): #iterate through each child in stack
if len(stack)>=2: #if the stack length >2, pop from bottom-to-top
p=stack.pop(0) #store the popped val in p variable
else:
p = stack.pop() #pop the node top_to_bottom
createNode(tree, p,b,stack) # pass p to the function as parent_node
return b # return the main root pointer
В этом коде b - это просто переменная, которая будет указывать на корневой узел, чтобы мы могли перебирать его по уровням и распечатывать.
Для печати на уровне уровня:
def printLevel(node):
if node is None:
return
queue = []
queue.append(node)
while(len(queue)>0):
n =len(queue)
while(n>0):
p = queue[0]
queue.pop(0)
if p.val !=0: #for avoiding the printing of '0'
print(p.val, end=' ')
for ind, value in enumerate(p.children):
queue.append(value)
n -= 1
print(" ")
Вывод:
2
3
4
5 #each level is getting printed
Я не знаю сейчас, как распечатать его наклонным способом): Все еще работаю над этим
Ну, я не профессионал в Python, просто новичок. Исправления и модификации приветствуются.