C# 기초 공부

[C#] 이진 트리 공부

jju_developer 2024. 10. 7. 20:37
728x90

- 각 노드에는 값이 있고, 이 값은 왼쪽 자식의 값보다 크고오른쪽 자식의 값보다 작습니다.


- 이진 탐색 트리는 효율적인 탐색과 삽입을 제공하며, 평균적으로 O(log n)의 시간 복잡도를 가집니다.

using System;

public class Node
{
    public int Data;
    public Node Left;
    public Node Right;

    public Node(int data)
    {
        Data = data;
        Left = null;
        Right = null;
    }
}

public class BinarySearchTree
{
    public Node Root;

    public BinarySearchTree()
    {
        Root = null;
    }

    // 1. 노드 삽입 메서드
    public void Insert(int data)
    {
        Root = InsertRec(Root, data);
    }

    private Node InsertRec(Node root, int data)
    {
        // 트리가 비어 있으면 새 노드를 반환
        if (root == null)
        {
            root = new Node(data);
            return root;
        }

        // 값이 현재 노드보다 작으면 왼쪽 서브트리에 삽입
        if (data < root.Data)
            root.Left = InsertRec(root.Left, data);
        // 값이 현재 노드보다 크면 오른쪽 서브트리에 삽입
        else if (data > root.Data)
            root.Right = InsertRec(root.Right, data);

        return root;
    }

    // 2. 값 탐색 메서드
    public bool Search(int data)
    {
        return SearchRec(Root, data);
    }

    private bool SearchRec(Node root, int data)
    {
        // 트리가 비어 있거나 원하는 값을 찾은 경우
        if (root == null)
            return false;

        if (root.Data == data)
            return true;

        // 값을 왼쪽 또는 오른쪽 서브트리에서 탐색
        if (data < root.Data)
            return SearchRec(root.Left, data);
        else
            return SearchRec(root.Right, data);
    }

    // 3. 트리 출력 (중위 순회)
    public void InOrderTraversal()
    {
        InOrderRec(Root);
        Console.WriteLine();
    }

    private void InOrderRec(Node root)
    {
        if (root != null)
        {
            InOrderRec(root.Left);  // 왼쪽 서브트리
            Console.Write(root.Data + " ");  // 현재 노드
            InOrderRec(root.Right);  // 오른쪽 서브트리
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        BinarySearchTree bst = new BinarySearchTree();

        // 노드 삽입
        bst.Insert(50);
        bst.Insert(30);
        bst.Insert(20);
        bst.Insert(40);
        bst.Insert(70);
        bst.Insert(60);
        bst.Insert(80);

        // 트리 출력 (중위 순회)
        Console.WriteLine("In-order traversal of the tree:");
        bst.InOrderTraversal();  // 출력: 20 30 40 50 60 70 80

        // 값 탐색
        int searchValue = 60;
        if (bst.Search(searchValue))
            Console.WriteLine($"{searchValue} found in the tree.");
        else
            Console.WriteLine($"{searchValue} not found in the tree.");
    }
}

 

 

728x90