C#/수업 내용

[C#] 일반 트리 level order traversal

JSH1 2021. 9. 26. 19:28

    class App
    {
        public App()
        {
            Tree bt = new Tree();
            Node root = bt.AddChild(bt.Root, "A", "A"); // (Node root, string target, string data)

            bt.AddChild(root, "A", "B");
            bt.AddChild(root, "A", "C");
            bt.AddChild(root, "A", "D");

            bt.AddChild(root, "B", "E");
            bt.AddChild(root, "C", "F");
            bt.AddChild(root, "D", "G");
            bt.AddChild(root, "D", "H");
            bt.AddChild(root, "D", "I");

            bt.AddChild(root, "H", "J");
            bt.AddChild(root, "I", "K");
            bt.AddChild(root, "I", "L");

            bt.AddChild(root, "L", "M");

            bt.LevelOrder(root);
        }
    }
    class Tree
    {
        public class Node
        {
            public string Data { get; private set; }
            public List<Node> Next = new List<Node>();

            public Node(string data)
            {
                Data = data;
            }
        }
        
        public Node Root { get; private set; }

        public void LevelOrder(Node root)
        {
            Queue<List<Node>> levelOrder = new Queue<List<Node>>();
            int level = 1;
            int queueCount = 0;

            if (root == null) return;

            Console.WriteLine("level {0}: {1}", level, root.Data);
            Console.WriteLine();

            levelOrder.Enqueue(root.Next);
            List<Node> node = levelOrder.Dequeue();

            level = 2;
            while (true)
            {
                if (queueCount != 0)
                {
                    node = levelOrder.Dequeue();
                    queueCount--;
                }

                for (int i = 0; i < node.Count; i++)
                {
                    Console.WriteLine("level {0}: {1}", level, node[i].Data);

                    if (node[i].Next.Count != 0)
                    {
                        levelOrder.Enqueue(node[i].Next);
                    }
                }

                if (queueCount == 0)
                {
                    queueCount = levelOrder.Count;
                    level++;
                }

                Console.WriteLine();
                if (levelOrder.Count == 0) return;
            }
        }

        public Node AddChild(Node root, string target, string data)
        {
            if (root == null)
            {
                return new Node(data);
            }

            else if (root.Data == target)
            {
                root.Next.Add(new Node(data));
            }

            else
            {
                Queue<List<Node>> nextQueue = new Queue<List<Node>>();
                List<Node> next = root.Next;

                while (true)
                {
                    if (nextQueue.Count != 0) next = nextQueue.Dequeue();
                    
                    for (int i = 0; i < next.Count; i++)
                    {
                        if (next[i].Data == target)
                        {
                            next[i].Next.Add(new Node(data));
                            return root;
                        }
                        else if (next[i].Next.Count != 0)
                        {
                            nextQueue.Enqueue(next[i].Next);
                        }
                    }

                    if (nextQueue.Count == 0) return root;
                }
            }
            return root;
        }
    }

'C# > 수업 내용' 카테고리의 다른 글

[C#] 이진 트리 Left Skewed Tree, Recursive Print  (0) 2021.09.27
[C#] 이진 트리 level order traversal  (0) 2021.09.27
[C#] Tree  (0) 2021.09.24
[C#] Queue 복습  (0) 2021.09.24
[C#] Queue  (0) 2021.09.23