반응형
트리클래스를 만들어보자
자식 노드를 추가하는 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();
}
}
}
반응형
'C# > 자료구조' 카테고리의 다른 글
0331_반복 방식으로 구현한 이진트리 순회 (0) | 2021.03.31 |
---|---|
0331 _ BinaryTree 배열로 구현하기 (0) | 2021.03.31 |
0330_ 왼쪽 자식 오른쪽 형제 표현법(LCRS)으로 Node생성 (0) | 2021.03.30 |
0330_ 고정배열/동적배열을 사용한 Tree 구현 (0) | 2021.03.30 |
0330_단일 연결리스트로 stack 구현하기 (0) | 2021.03.30 |