알고리즘 풀이

[C#] 백준 1991번 문제풀이

bimtaeur30 2026. 2. 28. 15:46

문제번호: 1991

문제명: 트리 순회

문제링크: https://www.acmicpc.net/problem/1991

문제내용과 예제 입/출력은 위 문제 링크에서 확인해 주시기 바랍니다

오늘은 트리순회 문제를 풀었습니다. 이 문제에서는 이진트리를 순회하는 방식이 3가지 존재합니다. 전위, 중위, 후위 순회입니다. (3가지 순회 방식에 대해서는 문제 링크로 확인해주시면 감사하겠습니다.)


이 문제를 해결하기 위해 Node의 정보를 담는 클래스를 만들어주었습니다. 노드 클래스에는 노드의 값, 왼쪽자식, 오른쪽자식이 들어있습니다.

트리입력을 받고 Node생성 및 정보입력을 한 후 노트리스트에 노드들을 하나씩 넣어주었습니다.


전위, 중위, 후위 순회 메서드들을 하나씩 생성하고 출력과 양쪽 재귀 순서를 전위, 중위, 후위에 맞게 변화를 주었습니다.
그 결과 전위, 중위, 후위 순회 순서에 맞게 결과값들이 출력됩니다.
다음은 정답코드입니다.

class Hello
{
    public static void Main()
    {
        using StreamReader sr = new StreamReader(Console.OpenStandardInput());
        using StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

        int N = int.Parse(sr.ReadLine());
        List<Node> Nodes = new List<Node>();

        for (int i = 0; i < N; i++)
        {
            string[] input = sr.ReadLine().Split();

            char parentChar = input[0][0]; // 여기 질문
            char leftChar = input[1][0];
            char rightChar = input[2][0];

            Node parent = GetOrCcreateNode(Nodes, parentChar);

            if (leftChar != '.')
            {
                parent.Left = GetOrCcreateNode(Nodes, leftChar);
            }

            if (rightChar != '.')
            {
                parent.Right = GetOrCcreateNode(Nodes, rightChar);
            }
        }

        Node root = Nodes.Find(n => n.Value == 'A');

        Preorder(root);
        sw.WriteLine();

        Inorder(root);
        sw.WriteLine();

        Postorder(root);

        void Preorder(Node node)
        {
            if (node == null) return;

            sw.Write(node.Value);
            Preorder(node.Left);
            Preorder(node.Right);
        }
        void Inorder(Node node)
        {
            if (node == null) return;

            Inorder(node.Left);
            sw.Write(node.Value);
            Inorder(node.Right);
        }
        void Postorder(Node node)
        {
            if (node == null) return;

            Postorder(node.Left);
            Postorder(node.Right);
            sw.Write(node.Value);
        }

        sr.Close();
        sw.Close();
    }

    static Node GetOrCcreateNode(List<Node> nodes, char value)
    {
        Node node = nodes.Find(n => n.Value == value);
        if (node == null)
        {
            node = new Node(value);
            nodes.Add(node);
        }
        return node;
    }
}

class Node
{
    public char Value;
    public Node Left;
    public Node Right;

    public Node(char value)
    {
        Value = value;
    }
}


'알고리즘 풀이' 카테고리의 다른 글

[C#] 백준 27964번 문제풀이  (1) 2026.03.02
[C#] 백준 4673번 문제풀이  (0) 2026.03.01
[C#] 백준 2470번 문제풀이  (0) 2026.02.27
[C#] 백준 2467번 문제풀이  (0) 2026.02.26
[C#] 백준 2606번 문제풀이  (0) 2026.02.26