C#/수업 과제
이진트리 구현과 순회
Game Client Lee Hwanguk
2023. 2. 13. 00:50
#이진트리(Binary)란?
-각각의 노드가 최대 두 개의 자식 노드를 가지는 트리 자료 구조로,
자식 노드를 각각 왼쪽 자식 노드와 오른쪽 자식 노드라고 한다.
#노드(Node)
트리를 구성하는 자료
#간선(Edge)
노드를 연결하는 선
#차수?
자식 노드의 수
#높이?
루트에서 해당 노드에 이르는 경로에 있는 간선의 수
#루트 노드?
트리의 시작 노드
#형제 노드?
같은 부모 노드의 자식노드들
#단말 , 리프노드?
자식이 없는 노드
#이진트리의 특징
*n개의 노드를 가진 이진 트리는 항상 (n-1)개의 간선을 갖는다
#이진트리의 순회
*이진트레이 있는 모든 노드를 한번씩 방문하여 노드가 가지고있는
데이터를 처리하는 것. 선형 자료구조는 순회하는 방법이 하나지만
트리는 계층적인 구조를 가지고 있음으로 여러가지 순회 방법이 있다.
*전위 순회(preorder traverse)-현재노드->Left->Right
*중위 순회(inorder traverse)-Left->현재노드->Righr
*후위 순회(postorder traverse)-Lefr->Right->현재노드
#TreeNode구현
class BinaryTree
{
public class Node
{
public int data; //data
public Node left;
public Node right;
public Node(int data)
{
this.data = data;
}
public Node rootNode;
#자식노드 추가
public Node()
{
Node A = new Node(1); //Root node
this.rootNode = A;
Node B=AddChildNode(A, 2);
Node C=AddChildNode(A, 3);
Node D=AddChildNode(B, 4);
Node E=AddChildNode(B, 5);
Node F=AddChildNode(C, 6);
Node G=AddChildNode(C, 7);
Node H=AddChildNode(D, 8);
}
public Node AddChildNode(Node parent, int data)
{
Node childNode = new Node(data);
if (parent.left == null) //left에 자식노드가 없다면
{
childNode = new Node(data); //data를 가지고있는 childNode 추가
parent.left = childNode;
}
else if (parent == null) //부모node가 없다면
{
childNode = null; //node를 추가하지 않음
}
else if (parent.right == null)//right에 자식노드가 없다면
{
childNode = new Node(data); //data를 가지고있는 childNode 추가
parent.right = childNode;
}
else
{
childNode = null; //이미 left,right 모두 있다면 추가하지 않는다
Console.WriteLine("left,right");
}
return childNode;
}
#순회(전위,중위,후위순회)
//전위 순회 (preorder traverse)
public void Preorder(Node parent) //parent->left->right
{
if(parent!=null) //parent 가 없을때 까지
{
Console.WriteLine("{0}", parent.data);
Preorder(parent.left); //재귀함수를 통해 반복
Preorder(parent.right);
}
}
//중위 순회 (inorder traverse)
public void Inorder(Node parent) //left->parent->right
{
if (parent != null)
{
Inorder(parent.left);
Console.WriteLine("{0}", parent.data);
Inorder(parent.right);
}
}
//후위 순회 (postorder traverse)
public void Postorder(Node parent) //left->right->parent
{
if (parent != null)
{
Postorder(parent.left);
Postorder(parent.right);
Console.WriteLine("{0}",parent.data);
}
}
#전체코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp19
{
class BinaryTree
{
public class Node
{
public int data; //data
public Node left;
public Node right;
public Node(int data)
{
this.data = data;
}
public Node rootNode;
//Binary Tree 구현
//Node추가 메서드 Addchild(Node parent, string data)
//--------------------------------------------------------------------
//Node추가(AddChildNode 메서드)
public Node()
{
Node A = new Node(1); //Root node
this.rootNode = A;
Node B=AddChildNode(A, 2);
Node C=AddChildNode(A, 3);
Node D=AddChildNode(B, 4);
Node E=AddChildNode(B, 5);
Node F=AddChildNode(C, 6);
Node G=AddChildNode(C, 7);
Node H=AddChildNode(D, 8);
}
public Node AddChildNode(Node parent, int data)
{
Node childNode = new Node(data);
if (parent.left == null) //left에 자식노드가 없다면
{
childNode = new Node(data); //data를 가지고있는 childNode 추가
parent.left = childNode;
}
else if (parent == null) //부모node가 없다면
{
childNode = null; //node를 추가하지 않음
}
else if (parent.right == null)//right에 자식노드가 없다면
{
childNode = new Node(data); //data를 가지고있는 childNode 추가
parent.right = childNode;
}
else
{
childNode = null; //이미 left,right 모두 있다면 추가하지 않는다
Console.WriteLine("left,right");
}
return childNode;
}
//-------------------------------------------------------------------
//BinaryTree 순회
//전위 순회 (preorder traverse)
public void Preorder(Node parent) //parent->left->right
{
if(parent!=null) //parent 가 없을때 까지
{
Console.WriteLine("{0}", parent.data);
Preorder(parent.left); //재귀함수를 통해 반복
Preorder(parent.right);
}
}
//중위 순회 (inorder traverse)
public void Inorder(Node parent) //left->parent->right
{
if (parent != null)
{
Inorder(parent.left);
Console.WriteLine("{0}", parent.data);
Inorder(parent.right);
}
}
//후위 순회 (postorder traverse)
public void Postorder(Node parent) //left->right->parent
{
if (parent != null)
{
Postorder(parent.left);
Postorder(parent.right);
Console.WriteLine("{0}",parent.data);
}
}
}
}
}