첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ 이진 검색 트리(Binary Search Tree)를 사용하는 방법을 보여준다.

TestProject.zip
0.00MB

▶ BinaryTreeNode.cs

namespace TestProject;

/// <summary>
/// 이진 트리 노드
/// </summary>
/// <typeparam name="TData">데이터 타입</typeparam>
public class BinaryTreeNode<TData>
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Property
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 왼쪽 노드 - LeftNode

    /// <summary>
    /// 왼쪽 노드
    /// </summary>
    public BinaryTreeNode<TData> LeftNode { get; set; }

    #endregion
    #region 오른쪽 노드 - RightNode

    /// <summary>
    /// 오른쪽 노드
    /// </summary>
    public BinaryTreeNode<TData> RightNode { get; set; }

    #endregion
    #region 데이터 - Data

    /// <summary>
    /// 데이터
    /// </summary>
    public TData Data { get; set; }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - BinaryTreeNode(data)

    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="data">데이터</param>
    public BinaryTreeNode(TData data)
    {
        Data = data;
    }

    #endregion
}

 

▶ BinarySearchTree.cs

namespace TestProject;

/// <summary>
/// 이진 검색 트리
/// </summary>
/// <typeparam name="T"></typeparam>
public class BinarySearchTree<T>
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Field
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region Field

    /// <summary>
    /// 루트 노드
    /// </summary>
    private BinaryTreeNode<T> rootNode = null;

    /// <summary>
    /// 비교자
    /// </summary>
    private Comparer<T> comparer = Comparer<T>.Default;

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 삽입하기 - Insert(value)

    /// <summary>
    /// 삽입하기
    /// </summary>
    /// <param name="value">값</param>
    public void Insert(T value)
    {
        BinaryTreeNode<T> node = this.rootNode;

        if(node == null)
        {
            this.rootNode = new BinaryTreeNode<T>(value);

            return;
        }

        while(node != null)
        {
            int result = comparer.Compare(node.Data, value);

            if(result == 0)
            {
                return;
            }
            else if(result > 0)
            {
                if(node.LeftNode == null)
                {
                    node.LeftNode = new BinaryTreeNode<T>(value);

                    return;
                }

                node = node.LeftNode;
            }
            else
            {
                if(node.RightNode == null)
                {
                    node.RightNode = new BinaryTreeNode<T>(value);

                    return;
                }

                node = node.RightNode;
            }
        }
    }

    #endregion

    #region 전위 순회하기 - TraversePreOrder()

    /// <summary>
    /// 전위 순회하기
    /// </summary>
    public void TraversePreOrder()
    {
        TraversePreOrder(this.rootNode);
    }

    #endregion
    #region 중위 순회하기 - TraverseInOrder()

    /// <summary>
    /// 중위 순회하기
    /// </summary>
    public void TraverseInOrder()
    {
        TraverseInOrder(this.rootNode);
    }

    #endregion
    #region 후위 순회하기 - TraversePostOrder()

    /// <summary>
    /// 후위 순회하기
    /// </summary>
    public void TraversePostOrder()
    {
        TraversePostOrder(this.rootNode);
    }

    #endregion

    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region 전위 순회하기 - TraversePreOrder(node)

    /// <summary>
    /// 전위 순회하기
    /// </summary>
    /// <param name="node">노드</param>
    private void TraversePreOrder(BinaryTreeNode<T> node)
    {
        if(node == null)
        {
            return;
        }

        Console.WriteLine(node.Data);

        TraversePreOrder(node.LeftNode);
        TraversePreOrder(node.RightNode);
    }

    #endregion
    #region 중위 순회하기 - TraverseInOrder(node)

    /// <summary>
    /// 중위 순회하기
    /// </summary>
    /// <param name="node">노드</param>
    private void TraverseInOrder(BinaryTreeNode<T> node)
    {
        if(node == null)
        {
            return;
        }

        TraverseInOrder(node.LeftNode);

        Console.WriteLine(node.Data);

        TraverseInOrder(node.RightNode);
    }

    #endregion
    #region 후위 순회하기 - TraversePostOrder(node)

    /// <summary>
    /// 후위 순회하기
    /// </summary>
    /// <param name="node">노드</param>
    private void TraversePostOrder(BinaryTreeNode<T> node)
    {
        if(node == null)
        {
            return;
        }

        TraversePostOrder(node.LeftNode);
        TraversePostOrder(node.RightNode);

        Console.WriteLine(node.Data);
    }

    #endregion
}

 

▶ Program.cs

namespace TestProject;

/// <summary>
/// 프로그램
/// </summary>
class Program
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Private

    #region 프로그램 시작하기 - Main()

    /// <summary>
    /// 프로그램 시작하기
    /// </summary>
    private static void Main()
    {
        BinarySearchTree<int> binarySearchTree = new BinarySearchTree<int>();

        binarySearchTree.Insert(4);
        binarySearchTree.Insert(2);
        binarySearchTree.Insert(6);
        binarySearchTree.Insert(1);
        binarySearchTree.Insert(7);

        binarySearchTree.TraverseInOrder();
    }

    #endregion
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요