C#/자료구조

0330 _ LCRSTree 구현 // 자동으로 노드 생성 및 출력하는 기능

minquu 2021. 3. 30. 18:17
반응형

트리클래스를 만들어보자

자식 노드를 추가하는 AddChild() . 형제노드를 추가하는 Addsibling()

Addchild() :  자식을 추가해주는 것
Addsibling() : 형제를 추가해주는것
PrintLevelOrder : 형제모두 출력을하고 , 그 자식은 큐에 넣어두고 나중에 출력한다.
형제 출력하고, 자식을 큐에서 꺼내어서 출력한다.
즉 레벨순으로 위에서부터 가로방향으로 출력  // 같은 레벨 출력 해주는것
printindentTree : 레벨 1인 노드는 앞에 공백하나 주고, 레벨 2인 노드는 공배 두개를 주는 방식으로 들여쓰기를 
통해서 계층을 출력하는 방식, 들여쓰기를 하나 추가해서 자기자신을 재귀호출하고,  전위 순회 로직을 기본으로 약간 변형한 것


 

 

1. 루트 생성해주기

 

 

2. Add child()

 

 

3. AddSibiling( ) 생성해주기

 

 

4. PrintLevelOder 생성

 

 

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace study17
{
    public class LCRSTree
    {
        public LCRSNode root;
        public LCRSTree(string data)
        {
            root = new LCRSNode(data);
        }
        public LCRSNode AddChild(LCRSNode parent, string data)
        {
            if (parent == null) return null;
            var node = new LCRSNode(data);
            if (parent.left == null)
            { //부모의 왼족 노드가 있으면 // 거기에 새로 만들어진 노드 넣기
                parent.left = node;
            }
            else {
                //있으면 그 노드의 오른쪽 있는지 검사 (오른쪽이 없을때까지 while 돌리기)
                var temp = parent.left; // temp에 레프트 값 넣기
                while (temp.right != null) {  //오른쪽이 널이 아니면 계속 돌고, 널이면 거기에 넣으면 됌
                    temp = temp.right;
                }
                //오른쪽 형제가 없는 노드를 찾았다.
                temp.right = node;
            }
            return node;
        }

        public LCRSNode AddSibiling(LCRSNode node, string data) {  //형제를 추가하는것
            if (node == null) return null;
            while (node.right != null) { //right가 널이 아니면 널일때까지 찾고, 찾으면 빠져나옴
                node = node.right;
            }
            //오른쪽이 널이면
            var sibilng = new LCRSNode(data); 
            node.right = sibilng;
            return sibilng;
        }
        public void PrintLevelOrder()
        {
            //Queue에 Root 노드 추가
            var queue = new Queue<LCRSNode>(); //새로운 큐를 만들어준다.
            queue.Enqueue(this.root); // 큐에 루트를 넣어준다.

            //큐에 요소가 있으면 // 즉 루트가 있는 경우
            while (queue.Count > 0) { //★ 카운터여서 빠져 나갈 수있다. 
                //꺼내서
                var node = queue.Dequeue(); // node에 디큐를 꺼낸다.
                //자식있는지 확인한다. 있으면 Queue에 등록
                if (node.left != null) {
                    queue.Enqueue(node.left);
                }

                //오른쪽에 형제가 있는지 검사
                while (node != null) {
                    Console.WriteLine("{0}", node.data);
                    node = node.right;
                }
            }
        }
    }
}

 

using System;

namespace ConsoleApp9
{
    public class App
    {
        public App() {
            Console.WriteLine("App");
            LCRSTree tree = new LCRSTree("A");
            var A = tree.root;

            var B = tree.AddChild(A, "B");
            tree.AddChild(A, "C");

            var D = tree.AddSibiling(B, "D");

            tree.AddChild(B, "E");
            tree.AddChild(B, "F");

            tree.AddChild(D, "G");

            tree.PrintLevelOrder();

        }
    }
}

 

반응형