Top 40 이진 트리 구현 The 81 New Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 이진 트리 구현 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://toplist.future-user.com team, along with other related topics such as: 이진 트리 구현 이진트리 구현 파이썬, 이진트리 구현 c++, 이진트리 구현 자바, c언어 이진트리 구현, c언어 이진트리 연결리스트 구현, 이진트리 삽입 구현, 이진트리 구현 java, 이진트리 배열 구현


20강 – 이진 트리의 구현과 순회 알고리즘 [ 실전 알고리즘 강좌(Algorithm Programming Tutorial) #20 ]
20강 – 이진 트리의 구현과 순회 알고리즘 [ 실전 알고리즘 강좌(Algorithm Programming Tutorial) #20 ]


자료구조 – 이진 트리 (binary tree) 와 이진트리의 순회(traversal) | ChanBLOG

  • Article author: chanhuiseok.github.io
  • Reviews from users: 21707 ⭐ Ratings
  • Top rated: 3.8 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 자료구조 – 이진 트리 (binary tree) 와 이진트리의 순회(traversal) | ChanBLOG 트리는 배열이나 연결리스트로 구현하는 것이 보편적이다. 배열로 트리를 구현할 때는 노드 넘버링을 할 때 통상 인덱스 1부터 시작함에 … …
  • Most searched keywords: Whether you are looking for 자료구조 – 이진 트리 (binary tree) 와 이진트리의 순회(traversal) | ChanBLOG 트리는 배열이나 연결리스트로 구현하는 것이 보편적이다. 배열로 트리를 구현할 때는 노드 넘버링을 할 때 통상 인덱스 1부터 시작함에 … 트리는 마치 나무를 거꾸로 한 모습과 비슷하다고 해서 붙여진 자료구조의 이름입니다.
  • Table of Contents:

트리와 관련된 용어 정리

이진트리와 관련한 개념 정리

이진 트리의 순회

이진 트리의 구현

소스코드

자료구조 - 이진 트리 (binary tree) 와 이진트리의 순회(traversal) | ChanBLOG
자료구조 – 이진 트리 (binary tree) 와 이진트리의 순회(traversal) | ChanBLOG

Read More

[자료구조] 이진 트리(Binary Tree) 개념과 구현

  • Article author: leejinseop.tistory.com
  • Reviews from users: 33039 ⭐ Ratings
  • Top rated: 4.5 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [자료구조] 이진 트리(Binary Tree) 개념과 구현 1차원 배열을 사용하여 이진 트리를 구현하면 각 노드의 부모 노드와 자식 노드가 저장된 배열 인덱스에 대하여 일정한 규칙을 찾을 수 있습니다. …
  • Most searched keywords: Whether you are looking for [자료구조] 이진 트리(Binary Tree) 개념과 구현 1차원 배열을 사용하여 이진 트리를 구현하면 각 노드의 부모 노드와 자식 노드가 저장된 배열 인덱스에 대하여 일정한 규칙을 찾을 수 있습니다. 1. 트리 트리(Tree)란 비선형 자료구조 중에서 자료들 간에 계층관계를 가진 계층형 자료구조(Hierarchical Data Structure)를 말합니다. · 노드(Node): 트리를 구성하는 원소(자료) · 간선(Edge): 노드를 연결..
  • Table of Contents:
[자료구조] 이진 트리(Binary Tree) 개념과 구현
[자료구조] 이진 트리(Binary Tree) 개념과 구현

Read More

[C] 이진 트리 구현 코드

  • Article author: eunjinii.tistory.com
  • Reviews from users: 21237 ⭐ Ratings
  • Top rated: 4.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [C] 이진 트리 구현 코드 이진 트리 노드 구현. 이진 트리는 부모가 왼쪽 자식, 오른쪽 자식을 가지고 있다는 점에서 포인터를 이용해서 구현하면 효과적인 데이터 관리가 가능 … …
  • Most searched keywords: Whether you are looking for [C] 이진 트리 구현 코드 이진 트리 노드 구현. 이진 트리는 부모가 왼쪽 자식, 오른쪽 자식을 가지고 있다는 점에서 포인터를 이용해서 구현하면 효과적인 데이터 관리가 가능 … 1. 이진 트리 노드 구현 이진 트리는 부모가 왼쪽 자식, 오른쪽 자식을 가지고 있다는 점에서 포인터를 이용해서 구현하면 효과적인 데이터 관리가 가능하다. 노드 구조체는 다음과 같다. #include #include typed..
  • Table of Contents:

프린세스 다이어리

[C] 이진 트리 구현 코드 본문

[C] 이진 트리 구현 코드
[C] 이진 트리 구현 코드

Read More

python으로 이진트리 구현하기

  • Article author: brunch.co.kr
  • Reviews from users: 6867 ⭐ Ratings
  • Top rated: 5.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about python으로 이진트리 구현하기 알고리즘 끝장내기 | 이진트리란 트리는 노드(Node)와 에지(Edge)로 구성된다. 노드는 동그라미이고 에지는 선이다. 노드는 자식을 가질 수 있다. …
  • Most searched keywords: Whether you are looking for python으로 이진트리 구현하기 알고리즘 끝장내기 | 이진트리란 트리는 노드(Node)와 에지(Edge)로 구성된다. 노드는 동그라미이고 에지는 선이다. 노드는 자식을 가질 수 있다. 알고리즘 끝장내기 | 이진트리란 트리는 노드(Node)와 에지(Edge)로 구성된다. 노드는 동그라미이고 에지는 선이다. 노드는 자식을 가질 수 있다. 맨 꼭 대기에 있는 1번 노드는 루트(Root)라고 한다. 루트 노드의 깊이를 1로 하고 한 단계 내려가면 깊이가 1만큼 증가한다. 트리 1과 트리 2는 노드와 에지를 가지고 있는 트리다. 1번부터 9번 노드를 가지고 있다.
  • Table of Contents:
python으로 이진트리 구현하기
python으로 이진트리 구현하기

Read More

C언어 – 이진 트리, 이진 탐색 트리 구현 (binary tree, binary search tree)

  • Article author: iyk2h.tistory.com
  • Reviews from users: 43234 ⭐ Ratings
  • Top rated: 3.6 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about C언어 – 이진 트리, 이진 탐색 트리 구현 (binary tree, binary search tree) C언어 – 이진 트리, 이진 탐색 트리 구현 (binary tree, binary search tree). by IYK2h 2021. 3. 5. 320×100. 코드 … …
  • Most searched keywords: Whether you are looking for C언어 – 이진 트리, 이진 탐색 트리 구현 (binary tree, binary search tree) C언어 – 이진 트리, 이진 탐색 트리 구현 (binary tree, binary search tree). by IYK2h 2021. 3. 5. 320×100. 코드 … 코드 //binary search tree #include #include typedef struct node { int data; struct node* left; struct node* right; }node; node* root; node* insert(node* root,int data) { if(root == NULL) { root = (n..
  • Table of Contents:

태그

관련글

댓글0

인기글

최근글

태그

전체 방문자

티스토리툴바

C언어 - 이진 트리, 이진 탐색 트리 구현 (binary tree, binary search tree)
C언어 – 이진 트리, 이진 탐색 트리 구현 (binary tree, binary search tree)

Read More

[자료구조] 이진탐색트리(Binary Search Tree)의 개념, 이해 | C언어 이진탐색트리 구현

  • Article author: code-lab1.tistory.com
  • Reviews from users: 15396 ⭐ Ratings
  • Top rated: 4.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [자료구조] 이진탐색트리(Binary Search Tree)의 개념, 이해 | C언어 이진탐색트리 구현 ( #이진트리 – 각 노드의 자식 노드가 최대 2개인 트리) 1. … 이진 탐색 트리의 탐색을 C언어로 구현하면 재귀를 이용할 수 있다. …
  • Most searched keywords: Whether you are looking for [자료구조] 이진탐색트리(Binary Search Tree)의 개념, 이해 | C언어 이진탐색트리 구현 ( #이진트리 – 각 노드의 자식 노드가 최대 2개인 트리) 1. … 이진 탐색 트리의 탐색을 C언어로 구현하면 재귀를 이용할 수 있다. 이진탐색트리(Binary Search Tree)이란? 이진탐색트리란 다음과 같은 특징을 갖는 이진트리를 말한다. ( #이진트리 – 각 노드의 자식 노드가 최대 2개인 트리) 1. 각 노드에 중복되지 않는 키(key)가 있다. 2. 루..
  • Table of Contents:
See also  Top 30 까르 보 불닭 전자 레인지 The 36 Detailed Answer

Header Menu

Main Menu

[자료구조] 이진탐색트리(Binary Search Tree)의 개념 이해 C언어 이진탐색트리 구현

이진탐색트리(Binary Search Tree)이란

이진 탐색 트리의 특징

‘Computer Science[자료구조]’ 관련 글

Sidebar – Right

Copyright © 코드 연구소 All Rights Reserved

Designed by JB FACTORY

티스토리툴바

[자료구조] 이진탐색트리(Binary Search Tree)의 개념, 이해 | C언어 이진탐색트리 구현
[자료구조] 이진탐색트리(Binary Search Tree)의 개념, 이해 | C언어 이진탐색트리 구현

Read More

자료구조-트리 (트리, 이진 트리, C로 구현)

  • Article author: foxtrotin.tistory.com
  • Reviews from users: 36203 ⭐ Ratings
  • Top rated: 3.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 자료구조-트리 (트리, 이진 트리, C로 구현) 자료구조-트리 (트리, 이진 트리, C로 구현). proqk 2020. 6. 10. 23:58 … 노드의 왼쪽 자식 노드를 루트로 하는 왼쪽 서브트리도 이진 트리. …
  • Most searched keywords: Whether you are looking for 자료구조-트리 (트리, 이진 트리, C로 구현) 자료구조-트리 (트리, 이진 트리, C로 구현). proqk 2020. 6. 10. 23:58 … 노드의 왼쪽 자식 노드를 루트로 하는 왼쪽 서브트리도 이진 트리. 트리 원소들 간에 1:n 관계를 가지는 비선형 자료구조 원소들 간에 계층 관계를 가지는 계층형 자료구조 상위 원소에서 하위 원소로 내려가면서 확장되는 트리 모양 구조 노드: 트리의 원소 -트리 A의 노드: A,B,..
  • Table of Contents:

안 쓰던 블로그

자료구조-트리 (트리 이진 트리 C로 구현) 본문

티스토리툴바

자료구조-트리 (트리, 이진 트리, C로 구현)
자료구조-트리 (트리, 이진 트리, C로 구현)

Read More

[ 자료구조 강좌 ] 6. 이진 트리 구현하기 : 네이버 블로그

  • Article author: m.blog.naver.com
  • Reviews from users: 3415 ⭐ Ratings
  • Top rated: 4.6 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [ 자료구조 강좌 ] 6. 이진 트리 구현하기 : 네이버 블로그 또한 이진 트리를 구현할 수 있다면 전위 순회, 중위. 순회, 후위 순회까지 다양한 응용이 가능합니다. 따라서 왠만하면 자신만의 이진 트리를 구현한 … …
  • Most searched keywords: Whether you are looking for [ 자료구조 강좌 ] 6. 이진 트리 구현하기 : 네이버 블로그 또한 이진 트리를 구현할 수 있다면 전위 순회, 중위. 순회, 후위 순회까지 다양한 응용이 가능합니다. 따라서 왠만하면 자신만의 이진 트리를 구현한 …
  • Table of Contents:

카테고리 이동

안경잡이개발자

이 블로그 
자료구조 강좌
 카테고리 글

카테고리

이 블로그 
자료구조 강좌
 카테고리 글

[ 자료구조 강좌 ] 6. 이진 트리 구현하기 : 네이버 블로그
[ 자료구조 강좌 ] 6. 이진 트리 구현하기 : 네이버 블로그

Read More


See more articles in the same category here: Top 767 tips update new.

[자료구조] 이진 트리(Binary Tree) 개념과 구현

1. 트리

트리(Tree)란 비선형 자료구조 중에서 자료들 간에 계층관계를 가진 계층형 자료구조(Hierarchical Data Structure)를 말합니다.

트리

· 노드(Node): 트리를 구성하는 원소(자료)

· 간선(Edge): 노드를 연결하는 선

· 차수(Dgree): 자식 노드의 수

· 높이(Height): 루트에서 해당 노드에 이르는 경로에 있는 간선의 수

· 루트 노드(Root Node): 트리의 시작 노드

· 형제 노드(Sibling Node): 같은 부모 노드의 자식노드들

· 조상 노드(Ancestor Node): 한 노드에서 간선을 따라 루트 노드까지 이르는 경로에 있는 노드들

· 자손 노드(Descendant Node): 한 노드의 서브 트리에 있는 노드들

· 단말 또는 리프 노드(Leaf Node): 자식이 없는 노드

2. 이진 트리

이진 트리(Binary Tree)란 모든 노드의 차수를 2 이하로 정하여 전체 트리의 차수가 2 이하가 되도록 만든 트리입니다.

이진 트리

· 이진 트리는 왼쪽 자식 노드와 오른쪽 자식 노드 2개만을 가질 수 있으며, 공백 노드도 이진 트리의 노드로 취급합니다.

· 이진 트리에 있는 모든 노드는 왼쪽 자식 노드를 루트로 하는 왼쪽 서브 트리와 오른쪽 자식 노드를 루트로 하는 오른쪽 서브 트리를 가집니다. 그리고 이진 트리의 서브 트리들 모두 이진 트리여야 합니다.

3. 이진 트리의 특징

① n개의 노드를 가진 이진 트리는 항상 (n-1)개의 간선을 갖습니다.

루트 노드 이외의 모든 노드는 한 개의 부모 노드를 가지고 있기 때문에 부모 노드와 연결하는 한 개의 간선을 갖습니다. 따라서 n개의 노드로 구성된 이진 트리에서 루트 노드를 제외한 나머지 노드의 개수가 (n-1)개이므로 (n-1)개의 간선을 갖습니다.

② 높이가 h인 이진 트리가 가질 수 있는 노드의 최소 개수는 (h+1)개, 최대 개수는 (2^(h+1) -1)개입니다.

이진 트리의 높이가 h가 되려면 한 레벨에 최소한 한 개의 노드가 있어야 하므로 높이가 h인 이진 트리의 최소 노드의 개수는 (h+1)개가 됩니다.

하나의 노드는 최대 2개의 자식 노드를 가질 수 있기 때문에 레벨 i에서 노드의 최대 개수는 2^i가 됩니다. 따라서 높이가 h인 이진 트리에서 최대 노드의 개수는 (2^(h+1) -1)개가 됩니다.

4. 이진 트리의 종류

① 포화 이진 트리

모든 레벨에 노드가 꽉 차있는 포화 상태의 이진 트리입니다. 즉 이진 트리의 높이가 h일 때 (2^(h+1) -1)개의 노드를 갖는 이진 트리를 말합니다.

포화 이진 트리

② 완전 이진 트리

높이가 h, 노드의 개수가 n개일 때(단, n < 2^(h+1) -1), 노드의 위치가 포화 이진 트리의 노드 1번 부터 n번까지의 위치와 완전히 일치하는 이진 트리입니다. 따라서 (n+1)번 부터 (2^(h+1) -1)번까지는 공백 노드가 됩니다. 완전 이진 트리 ③ 편향 이진 트리 이진 트리 중에서 최소 개수의 노드를 가지면서 왼쪽이나 오른쪽 서브 트리만 가지고 있는 트리입니다. 즉 이진 트리의 높이가 h일 때 (h+1)개의 노드를 가지면서 한 쪽으로 치우친 이진 트리를 말합니다. 왼쪽 편향 이진 트리와 오른쪽 편향 이진 트리 5. 이진 트리의 구현 · 순차 자료구조 방식 1차원 배열에서 인덱스 계산을 간단히 하기 위해서 인덱스 0번은 사용하지 않고 비워두고, 인덱스 1번에 루트를 저장합니다. 완전 이진 트리의 배열 표현 1차원 배열을 사용하여 이진 트리를 구현하면 각 노드의 부모 노드와 자식 노드가 저장된 배열 인덱스에 대하여 일정한 규칙을 찾을 수 있습니다. 노드 인덱스 조건 노드 i의 부모 노드 i / 2 i > 1 노드 i의 왼쪽 자식 노드 i * 2 (i * 2) <= n 노드 i의 오른쪽 자식 노드 (i * 2) + 1 (i * 2) + 1 <= n · 연결 자료구조 방식 배열을 이용한 이진 트리의 구현은 인덱스 규칙에 따라 부모 노드와 자식 노드를 찾기 쉽다는 장점이 있습니다. 하지만 메모리 공간의 사용에 있어 완전 이진 트리의 경우에는 최적의 공간 사용이 되지만, 편향 이진 트리의 경우 많은 공간이 낭비됩니다. 따라서 메모리 낭비 문제와 삽입 · 삭제 연산이 비효율적인 순차 자료구조 방식 보다는 연결 자료구조 방식을 많이 사용합니다. 이진 트리의 노드는 왼쪽 자식 노드와 오른쪽 자식 노드를 연결해야 하므로 데이터를 저장하는 데이터 필드, 왼쪽 자식 노드를 연결하는 왼쪽 링크 필드와 오른쪽 자식 노드를 연결하는 오른쪽 링크 필드로 구성된 참조 변수를 사용해야 합니다. public class TreeNode { private Object data; TreeNode left; TreeNode right; public TreeNode(Object data) { this.data = data; this.left = null; this.right = null; } public Object getData() { return this.data; } } 6. 이진 트리의 순회 이진 트리에 있는 모든 노드를 한번씩 모두 방문하여 노드가 가지고 있는 데이터를 처리하는 것을 순회라고 합니다. 선형 자료구조는 순회하는 방법이 한 가지였지만, 트리는 계층적인 구조를 가지고 있기 때문에 여러 가지 순회 방법이 있습니다. 하나의 노드에서 순회를 위해 수행할 수 있는 작업은 (1) 현재 노드를 방문하여 데이터를 읽는 작업, (2) 현재 노드의 왼쪽 서브 트리로 이동하는 작업, (3) 현재 노드의 오른쪽 서브 트리로 이동하는 작업이 있습니다. 그리고 서브 트리를 순회하는 순서는 항상 왼쪽 서브 트리를 먼저 방문하고, 그 후에 오른쪽 서브 트리를 방문하는 것으로 합니다. 따라서 현재 노드를 방문하는 순서에 따라 전위 순회, 중위 순회, 후위 순회로 나눌 수 있습니다. · 전위 순회(Preorder Traversal) 현재 노드를 방문 → 왼쪽 서브 트리 방문 → 오른쪽 서브 트리 방문 preorder(T) if(T != null) then{ visit T.data; preorder(T.left); preorder(T.right); } end preorder() · 중위 순회(Inorder Traversal) 왼쪽 서브 트리 방문 → 현재 노드를 방문 → 오른쪽 서브 트리 방문 inorder(T) if(T != null) then { inorder(T.left); visit T.data; inorder(T.right); } end inorder() · 후위 순회(Postorder Traversal) 왼쪽 서브 트리 방문 → 오른쪽 서브 트리 방문 → 현재 노드를 방문 postorder(T) if(T != null) then { postorder(T.left); postorder(T.right); visit T.data; } end postorder(T) 7. 이진 트리 소스 코드 · TreeNode public class TreeNode { private Object data; // 데이터 필드 TreeNode left; // 왼쪽 링크 필드 TreeNode right; // 오른쪽 링크 필드 public TreeNode(Object data) { this.data = data; this.left = null; this.right = null; } public Object getData() { return this.data; } } · LinkedTree public class LinkedTree { // 이진 트리 노드 생성 public TreeNode makeBT(TreeNode left, Object data, TreeNode right) { TreeNode newNode = new TreeNode(data); newNode.left = left; newNode.right = right; return newNode; } // 전위 순회 public void preorder(TreeNode node) { if (node != null) { System.out.printf("%c", node.getData()); preorder(node.left); preorder(node.right); } } // 중위 순회 public void inorder(TreeNode node) { if (node != null) { inorder(node.left); System.out.printf("%c", node.getData()); inorder(node.right); } } // 후위 순회 public void postorder(TreeNode node) { if (node != null) { postorder(node.left); postorder(node.right); System.out.printf("%c", node.getData()); } } } · MainForLinkedTree public class MainForLinkedTree { public static void main(String[] args) { LinkedTree t = new LinkedTree(); TreeNode n7 = t.makeBT(null, 'D', null); TreeNode n6 = t.makeBT(null, 'C', null); TreeNode n5 = t.makeBT(null, 'B', null); TreeNode n4 = t.makeBT(null, 'A', null); TreeNode n3 = t.makeBT(n6, '-', n7); TreeNode n2 = t.makeBT(n4, '+', n5); TreeNode n1 = t.makeBT(n2, '*', n3); // 전위 순회 System.out.printf("preorder: "); t.preorder(n1); // 중위 순회 System.out.printf(" inorder: "); t.inorder(n1); // 후위 순회 System.out.printf(" postorder: "); t.postorder(n1); } } · 실행 결과

[C] 이진 트리 구현 코드

728×90

1. 이진 트리 노드 구현

이진 트리는 부모가 왼쪽 자식, 오른쪽 자식을 가지고 있다는 점에서 포인터를 이용해서 구현하면 효과적인 데이터 관리가 가능하다.

노드 구조체는 다음과 같다.

#include #include typedef struct Node { int data; struct Node *leftChild; struct Node *rightChild; } Node;

하나의 노드는 내부적으로 하나의 data를 가지고 있다. 여기 예시 코드에서는 정수형 데이터 하나만 들어가는 걸로 설정했지만, 실제로는 다양한 데이터가 data에 들어갈 수 있다.

특정 노드를 초기화하는 함수는 다음과 같다.

Node* initNode(int data, Node* leftChild, Node* rightChild) { Node* node = (Node*) malloc(sizeof(Node)); node -> data = data; node -> leftChild = leftChild; node -> rightChild = rightChild; return node; }

이진트리 같은 경우에는 함수의 반환형에서 특정 노드의 포인터가 들어가는 경우가 많다. data, leftNode, rightNode 모두 초기화시켜준 다음, 그 노드의 포인터를 반환해 준다.

2. 이진 트리의 순회 알고리즘

이진 트리는 자료구조이기 때문에 컴퓨터의 메모리상에 올라가 있어 사람이 이진트리에 담긴 데이터를 시각화하기란 어렵다. 따라서 이진트리에 담긴 데이터를 조회해서 출력하는 방법으로는 주로 순회 기법을 사용한다. 크게 세 가지 순회 방법이 있다.

(1) 전위 순회

– 자기 자신을 출력한다 -> 왼쪽 자식을 방문한다. -> 오른쪽 자식을 방문한다.

전위 순회 같은 경우에는 먼저 루트에서 시작하면 자기 자신을 출력하고, 그 다음에 왼쪽 자식노드로 들어가서 데이터를 출력하고, 다시 그 노드의 왼쪽 자식노드로 들어가서 데이터를 출력한다. 마지막에 다다르면 부모 노드로 거슬러 올라갔다가, 부모 노드의 오른쪽 자식 노드로 가서 데이터를 출력한다.

전위 순위법

void preorder(Node* root) { if (root) { printf(“%d “, root -> data); preorder(root -> leftChild); preorder(root -> rightChild); } }

특정한 노드가 주어졌을 때, 그 노드가 null값이 아니라면 재귀적으로 다음 노드를 탐색한다. 먼저 자기 자신을 출력한 후에 왼쪽으로 들어가고, 마지막에 왼쪽 노드가 null이면 이제 오른쪽 노드로 들어가는 것이다.

(2) 중위 순회

– 왼쪽 자식 출력 -> 그 다음 자기 자신 출력 -> 오른쪽 자식 출력

맨 위 노드에서 계속 왼쪽 자식 노드로 내려간 다음, 1을 출력한다. 그 다음 2, 3을 출력한다. 돌아와서 4를 출력하고 같은 과정을 반복한다. 항상 왼쪽으로 쭉 내려갔다가 자신으로 돌아온 후 오른쪽으로 간다. 결과적으로 왼쪽에서부터 오른쪽으로 차례로 출력된다.

중위 순위법

void inorder(Node* root) { if (root) { inorder(root -> leftChild); printf(“%d “, root -> data); inorder(root -> rightChild); } }

전위순위랑 비슷하고 코드의 순서만 바꿔주면 된다. 왼쪽 노드를 먼저 방문 후, 자기 자신을 출력하고 오른쪽을 방문한다.

(3) 후위 순위

– 왼쪽 자식 방문 -> 오른쪽 자식 방문 -> 자기 자신 출력

먼저 왼쪽 최하단 노드 1을 방문한 다음, 그 형제 노드 2를 방문한 후 부모 노드 3을 출력한다. 그리고 루트의 오른쪽 4, 5, 6 노드들에 대해서도 같은 연산을 반복한 다음 루트로 돌아와서 출력한다. 이 알고리즘은 루트가 가장 마지막에 출력된다는 특징이 있다.

후위 순위법

void postorder(Node* root) { if (root) { postorder(root -> leftChild); postorder(root -> rightChild); printf(“%d “, root -> data); } }

마찬가지로 코드의 순서만 바꿔주면 된다. 왼쪽 노드를 먼저 방문 후, 오른쪽을 방문한 다음 자기 자신을 출력한다.

3. 순회 알고리즘 코드로 표현해보기

int main(void) { Node* n7 = initNode(50, NULL, NULL); Node* n6 = initNode(37, NULL, NULL); Node* n5 = initNode(23, NULL, NULL); Node* n4 = initNode(5, NULL, NULL); Node* n3 = initNode(48, n6, n7); Node* n2 = initNode(17, n4, n5); Node* n1 = initNode(30, n2, n3); preorder(n1); printf(”

“); inorder(n1); printf(”

“); postorder(n1); printf(”

“); }

루트 노드를 n1이라고 하고 그 자식을 각각 n2, n3라 한다. 또 각 자식도 자식노드를 가진다. 이 하위 자식노드는 더 이상 자식 노드를 갖지 않기 때문에 왼쪽 노드, 오른쪽 노드 부분에 NULL을 넣어 준다. 차례대로 전위, 중위, 후위순회를 실행해 보면 다음과 같이 출력된다.

30 17 5 23 48 37 50 5 17 23 30 37 48 50 5 23 17 37 50 48 30

728×90

반응형

python으로 이진트리 구현하기

이진트리란

트리는 노드(Node)와 에지(Edge)로 구성된다. 노드는 동그라미이고 에지는 선이다. 노드는 자식을 가질 수 있다. 맨 꼭 대기에 있는 1번 노드는 루트(Root)라고 한다. 루트 노드의 깊이를 1로 하고 한 단계 내려가면 깊이가 1만큼 증가한다.

트리의 종류

트리 1과 트리 2는 노드와 에지를 가지고 있는 트리다. 1번부터 9번 노드를 가지고 있다. 둘 다 1번 노드가 루트이고 깊이는 4이다. 2번 노드를 보면 두 트리의 차이점을 알 수 있다. 트리 1의 2번 노드는 자식 노드가 3개이지만 트리 2는 2번 노드의 자식 노드는 2개이다.

트리 2처럼 모든 노드가 최대 두 개의 자식을 갖는 트리를 이진트리라고 한다. 이진트리는 깊이 h에 최대 2^{h-1}만큼 노드를 가질 수 있다.

자 이제, 다음과 같은 이진트리를 python으로 생성해보자.

이진트리 만들기

Node는 자기 자신의 값인 item과 자식의 위치인 left와 right를 가진다.

class Node:

def __init__(self, item):

self.item = item

self.left = None

self.right = None

각 노드를 생성한다.

n1 = Node(10)

n2 = Node(20)

n3 = Node(30)

n4 = Node(40)

n5 = Node(50)

n6 = Node(60)

n7 = Node(70)

n8 = Node(80)

각 노드를 엮어주기 위하여 BinaryTree를 만든다.

class BinaryTree():

def __init__(self): #트리 생성

self.root = None

순서에 맞게 노드를 엮는다.

tree = BinaryTree()

tree.root = n1

n1.left = n2

n1.right = n3

n2.left = n4

n2.right = n5

n3.left = n6

n3.right = n7

n4.left = n8

트리 순회란

트리 순회란 트리의 노드를 지정한 순서대로 방문하는 것을 말한다. 이진트리를 순회하는 방법은 대표적으로 3개이다. 여기에 1가지를 더해 총 4가지를 python으로 구현해보자.

전위 순회 (Preorder)

후위 순회 (Postorder)

중위 순회 (Inorder)

레벨 순회 (Levelorder)

트리를 읽을 때에 대전제는 왼쪽부터 오른쪽으로 읽는다는 것이다. 오른쪽에서부터 왼쪽으로는 읽지 않는다. “방문”은 자신의 번호를 출력하는 print() 함수로 표현한다. 이 출력 함수의 위치에 따라서 트리를 순회하는 방법을 구분하는 것이다.

트리 순회

전위 순회 ( Pre order)

자기 자신을 먼저 출력하고 자식 노드를 호출한다. 순서는 다음과 같다.

자기 자신 출력

왼쪽 서브 트리 호출

오른쪽 서브 트리 호출

그렇다면 출력은 어떤 순서로 될까?

우선 맨 위 루트부터 방문하므로 자기 자신인 10을 출력한다. 그 후에 왼쪽에 있는 트리를 호출한다.

왼쪽에 있는 20번 노드를 방문했으므로 20을 출력한다. 그 후에 왼쪽에 있는 트리를 호출한다.

왼쪽에 있는 40번 노드를 방문했으므로 40을 출력한다. 그 후에 왼쪽에 있는 트리를 호출한다.

왼쪽에 있는 80번 노드를 방문했으므로 80을 출력한다. 80번 노드는 자식 노드가 없으므로 더 호출하지 않는다.

40번 노드로 올라간다. 40번 노드의 오른쪽 노드가 없으므로 더 호출하지 않는다.

20번 노드로 올라간다. 20번 노드의 오른쪽 노드인 50번 노드를 방문한다. 50번 노드 출력. 50번 노드가 자식 노드가 없으므로 호출 끝.

20번 노드로 올라간다. 호출할 자식 노드 없으므로 10번 노드로 올라간다.

오른쪽의 30번 노드를 방문한다. 30을 출력한다. 왼쪽 노드인 60번 노드 방문. 60을 호출. 자식 노드 없으므로 호출 끝.

30번 노드로 올라간다. 오른쪽 노드인 70번 노드를 방문한다. 70을 출력한다. 자식 노드 없으므로 호출 끝.

정답 : 10 20 40 80 50 30 60 70

# 전위 순회

def preorder(self, n):

if n != None:

print(n.item, ”, end=”) # 노드 방문

if n.left:

self.preorder(n.left) # 왼쪽 서브 트리 순회

if n.right:

self.preorder(n.right) # 오른쪽 서브 트리 순회

후위 순회 (Postorder)

자기 자신 출력을 가장 나중에 한다.

왼쪽 서브 트리 호출

오른쪽 서브 트리 호출

자기 자신 출력

# 후위 순회

def postorder(self, n):

if n != None:

if n.left:

self.postorder(n.left)

if n.right:

self.postorder(n.right)

print(n.item, ”, end=”) # 노드 방문

호출을 먼저 하고 끝이 보이면 자기 자신을 출력하므로 가장 왼쪽 노드인 80부터 출력된다.

정답 : 80 40 50 20 60 70 30 10

중위 순회 (Inorder)

자기 자신 출력이 중간에 있다.

왼쪽 서브 트리 호출

자기 자신 출력

오른쪽 서브 트리 호출

# 중위 순회

def inorder(self, n):

if n != None:

if n.left:

self.inorder(n.left)

print(n.item, ”, end=”) # 노드 방문

if n.right:

self.inorder(n.right)

정답 : 80 40 20 50 10 60 30 70

레벨 순회 (Levelorder)

레벨 순회는 깊이(레벨) 단위로 출력하는 것이다. 그 순서는 깊이가 낮은 순서이다. 우리가 흔히 생각하는 10 20 30 40 50 60 70 80 순으로 출력하고 싶다면 어떻게 해야 할까? 호출될 때마다 자식 노드를 따로 저장하는 것이다. 선입선출 구조인 큐로 구현한다.

# 레벨 순회

def levelorder(self, n):

q = []

q.append(n)

while q:

t = q.pop(0)

print(t.item, ”, end=”)

if t.left != None:

q.append(t.left)

if t.right != None:

q.append(t.right)

정답 : 10 20 30 40 50 60 70 80

전체 코드

전체 코드는 블로그를 참조하라. 이제 이진 트리라는 자료구조를 구현하는 방법을 알았다. 다음에는 이 구조를 활용하여 결정 트리(Decision Tree)를 만들어 보자.

qqplot의 기술 블로그

https://qqplot.github.io/

So you have finished reading the 이진 트리 구현 topic article, if you find this article useful, please share it. Thank you very much. See more: 이진트리 구현 파이썬, 이진트리 구현 c++, 이진트리 구현 자바, c언어 이진트리 구현, c언어 이진트리 연결리스트 구현, 이진트리 삽입 구현, 이진트리 구현 java, 이진트리 배열 구현

Leave a Comment