Binary 트리에서 분명 node 인데도 attribute error 가 계속 뜹니다.
조회수 1658회
안녕하세요.. 너무스트레스받고 아무도 안도와주고 찾아도 없어서 질문하게 되었습니다..
학교에서 아무도 안도와주고 학교 교수는 답변도 없고 관심도 없네요.. 가르치는 퀄리티도 너무 안좋고 제대로 배우지도 않은걸로 혼자 끙끙앓고 있습니다.. 답변 부탁드릴께요..
길어질꺼 같은데.. 죄송합니다 ..
문제는 바이너리트리 클래스로 만든 트리에서 레벨오더로 리스트로 빼는 문제입니다..
class RefBinaryTree:
def __init__(self,data):
self.data = data
self.left = None
self.right = None
def insert_left(self,data):
t = RefBinaryTree(data)
if self.left is None:
self.left = t
else:
t.left = self.left
self.left = t
def insert_right(self,data):
t = RefBinaryTree(data)
if self.right is None:
self.right = t
else:
t.right = self.right
self.right = t
def set_value(self,val):
self.data = val
def get_value(self):
return self.data
def get_right_subtree(self):
return self.right
def get_left_subtree(self):
return self.left
def test_tree(tree):
tree.insert_left(31)
tree.insert_right(5)
tree.get_left_subtree().insert_left(27)
tree.get_right_subtree().insert_right(1)
tree.get_right_subtree().get_right_subtree().insert_left(7)
return tree
def tree_to_list(tree):
treeList = []
if not tree:
return [None]
level_process = [tree.get_value()]
print(level_process)
item_left = item.left.get_left_subtree()
print(item_left)
while len(level_process) > 0:
num_level = []
next_level = []
for n in level_process:
num_level.append(n)
if n.left.get_value() != None:
next_level.append(n.left.get_value())
if n.left.get_value() == None:
next_level.append(None)
if n.right.get_value() != None:
next_level.append(n.right.get_value())
if n.right.get_value() == None:
next_level.append(None)
treeList.append(num_level)
level_process = next_level
return treeList
tree = RefBinaryTree(2)
a_tree = test_tree(tree)
tree_list = tree_to_list(a_tree)
print(tree_list)
테스트 트리로 과제에서 보여준 트리를 일단 만들었습니다.. 그리고 나서 하라는게 트리에서 리스트로 정리하는건데 ( 레벨 오더로) 코드를 써서 넣어보긴 했는데 에러가 뜹니다..
아마 밑에 포룹에서 뭔가 인식을못하는거 같은데..왜 안되는건지 모르겠습니다..
for n in level_process:
레벨 프로세스에 저장된게 분명히 트리의 노드인데 자꾸 인티저뒤에 left 뭐 이런거 붙었다고 attribute error 가 뜨네요.. 어떻게 하면 가능하게 할수 있는지.. 아니면 뭐 리커젼같은걸 써서 뭔가 초간단하게 할수 있는 방법이 있다던지.. 알고싶습니다 ㅠ...
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
이진트리의 insert가 이상한 형태네요. 이진트리라면 insert_left와 insert_right를 따로 구현하기 보다는 하나의 insert를 제공하는게 맞습니다. insert되어야 할 값이 내가 가진 값보다 작으면 왼쪽노드에 추가하고, 크거나 같으면 오른쪽 노드에 추가하도록 구현해야져. 그리고 왼쪽이나 오른쪽에 이미 노드가 있으면 값만 전달해서 그 노드가 처리하도록 하면 됩니다.
class RefBinaryTree: def __init__(self,data): self.data = data self.left = None self.right = None def insert(self,data): if data < self.data: if self.left: self.left.insert(data) else: self.left = RefBinaryTree(data) else: if self.right: self.right.insert(data) else: self.right = RefBinaryTree(data) def print_tree(self): if self.left: self.left.print_tree() print(self.data) if self.right: self.right.print_tree() root_node = RefBinaryTree(2) root_node.insert(31) root_node.insert(5) root_node.insert(27) root_node.insert(1) root_node.insert(7) root_node.print_tree()
올려주셨던 코드대로 루트가 2의 값을 가지도록 하고 31,5,27,1,7을 순차로 트리에 넣었습니다. 그리고 순서대로 출력하는 print_tree메소드를 만들었는데요. print_tree메소드를 참고해서 리스트로 만드는 기능을 구현해보세요. 코드 아래의 실행하기를 눌러주시면 바로 실행됩니다.
recursive한 방법을 이용했는데요. 질문에 올려주셨던 반복문을 이용하는것도 알아두시는게 좋습니다.
댓글 입력