Binary 트리에서 분명 node 인데도 attribute error 가 계속 뜹니다.

조회수 1653회

안녕하세요.. 너무스트레스받고 아무도 안도와주고 찾아도 없어서 질문하게 되었습니다..
학교에서 아무도 안도와주고 학교 교수는 답변도 없고 관심도 없네요.. 가르치는 퀄리티도 너무 안좋고 제대로 배우지도 않은걸로 혼자 끙끙앓고 있습니다.. 답변 부탁드릴께요.. 길어질꺼 같은데.. 죄송합니다 .. 문제는 바이너리트리 클래스로 만든 트리에서 레벨오더로 리스트로 빼는 문제입니다..

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 가 뜨네요.. 어떻게 하면 가능하게 할수 있는지.. 아니면 뭐 리커젼같은걸 써서 뭔가 초간단하게 할수 있는 방법이 있다던지.. 알고싶습니다 ㅠ...

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 올려주신 코드에서는 우선 NameError: global name 'item' is not defined라는 에러가 발생하네요. 그리고 오류 메시지를 정확히 적어주세요. "left뭐 이런거 붙었다고..."라고 적어주시면 이해가 어렵습니다. 정토드 2016.5.28 10:29
  • 죄송합니다 ㅠ 다행히 무슨문제인지 알아내었습 알 수 없는 사용자 2016.6.4 10:06
  • 습니다 ㅠ ㅎㅎ 알 수 없는 사용자 2016.6.4 10:07

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한 방법을 이용했는데요. 질문에 올려주셨던 반복문을 이용하는것도 알아두시는게 좋습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)