


배열이나 연결리스트, 스택, 큐처럼 일직선 데이터가 아니라 부모 자식 관계를 갖는 데이터들을 정리해둔 자료구조를 트리라고 한다.
데이터가 선형인지 비선형인지에 따라 정리하는 자료구조가 다르다. 그 중에서 트리와 그래프는 비선형 자료를 정리할 때 사용하는 데이터 구조이다. 둘의 차이점은 순환 구조의 여부이다.
트리 구조는 순환 구조를 갖지 않는다.


노드가 하나 이상의 자식을 가지면 트리 구조라고 말한다. 그 중에서 이진트리는 자식 노드의 개수가 2개이하인 트리를 말한다.

공부중
선형 자료 구조에서는 데이터에 순차적으로 접근하지만, 트리 구조에서는 다른 방식으로 데이터에 접근해야 한다.
트리구조에서 데이터(노드)를 방문하는 과정을 트리 순회라고 하며, 그 방법에는 전위 순회(preorder), 중위순회(inorder), 후위 순회(postorder) 세 가지가 있다.
그래프 순회 방식에는 크게 DFS와 BFS가 있는데, 트리구조에서 순회 방식은 DFS를 이용한다.
이름에서도 알 수 있듯이 pre라는 뜻이 root node를 먼저 방문 처리 한 이후에 왼쪽 노드 -> 오른쪽 노드 순서로 탐색하겠다는 뜻이다.

tree = ['A', 'B', 'C', 'D', 'E', 'F', None, 'G']
stack = [] #방문해야 하는 노드를 저장
def preorder(tree): #root -> left -> right
stack = [0]
res = [] #방문한 노드를 저장
while stack:
node = stack.pop()
res.append(tree[node])
node = node * 2 + 2 #오른쪽 노드
if node < len(tree) and tree[node] != None:
stack.append(node)
node = node - 1 #왼쪽 노드
if node < len(tree) and tree[node] != None:
stack.append(node)
return res
print(preorder(tree))
스택에 오른쪽 노드를 먼저 담고, 그 다음에 왼쪽 노드를 담는 이유는 왼쪽 노드 먼저 방문해야 하기 때문이다!
중위 순회는 일단 left node먼저 탐색하고, 그 다음에 root node를 방문처리하고, right node를 탐색해나가는 과정이다.

공부중
후위 순회는 left node먼저 탐색, 그 다음 right node 탐색, 마지막에 root node를 방문처리 하며 탐색하는 과정이다.

공부중