TREE.zip지난 포스트(선형 연결리스트)에 이어
색인 파일 구축을 위해 TREE알고리즘을 C#을 이용하여 만들어봤습니다.
이소스는 트리검색의 효율을 높이기 위해 트리 균형을 잡아주는 부분은 빠져있습니다.
다음 포스트에 완벽하게 트리균형을 잡아가는 TREE를 만들고 파일에 기록하는 부분까지 하겠습니다.
그렇게 되면 색인파일 DB의 기본을 만들 수 있습니다.
1. 노드 추가public void Add(int key,string content)
{
Node parentNode , inputNode;
parentNode = head;
inputNode = head.Left;
while (inputNode != null)
{
parentNode = inputNode;
if (key < inputNode.Key)
inputNode = inputNode.Left;
else
inputNode = inputNode.Right;
}
inputNode = new Node();
inputNode.Key = key;
inputNode.Content = content;
inputNode.Left = null;
inputNode.Right = null;
if (key < parentNode.Key || parentNode == head)
parentNode.Left = inputNode;
else
parentNode.Right =inputNode;
}
2. 노드검색public Node Search(int key)
{
Node searchNode;
searchNode = head.Left;
while (searchNode != null && key != searchNode.Key)
{
if (key < searchNode.Key)
searchNode = searchNode.Left;
else
searchNode = searchNode.Right;
}
if (searchNode == null) return null;
else return searchNode;
}
3. 노드삭제 노드 삭제는 개선이 가능함... 다음 포스트의 트리에서는 개선한 삭제 방법을 사용하겠습니다.public void Del(int key)
{
Node parentNode //삭제할 노드의 부모노드
, sonNode //삭제할 노드 대신 부모의 자손으로 갈 노드
, delNode //삭제 대상 노드
, sonparentNode; //sonNode 의 부모노
parentNode = head;
delNode = head.Left;
while (key != delNode.Key && delNode != null)
{
parentNode = delNode;
if (key < delNode.Key)
delNode = delNode.Left;
else
delNode = delNode.Right;
}
if (delNode == null) return; //못찾았다면 null 리턴
//////유형1 자식노드가 모두 없을때
if (delNode.Left == null && delNode.Right == null)
{
sonNode = null;
}
//////유형3 오른쪽 왼쪽 자식이 모두 있을때
else if (delNode.Left != null && delNode.Right != null)
{
sonparentNode = delNode.Right;
//// 유형 3-2 삭제노드의 오른쪽 자식의 왼쪽자식이 존재할때
if (sonparentNode.Left != null)
{
while (sonparentNode.Left.Left != null)
sonparentNode = sonparentNode.Left;
sonNode = sonparentNode.Left; //가장왼쪽 노드
sonparentNode.Left = sonNode.Right;
sonNode.Left = delNode.Left;
sonNode.Right = delNode.Right;
}
//// 유형 3-2 삭제노드의 오른쪽 자식의 오른쪽자식이 존재할때
else
{
sonNode = sonparentNode;
sonNode.Left = delNode.Left;
}
}
////유형2 오른쪽 왼쪽 자식이 하나만 있을때
else
{
//// 유형 2-2 삭제노드의 왼쪽이 존재할때
if (delNode.Left != null) sonNode = delNode.Left;
////유형 2-1 삭제노드의 오른쪽이 존재할때
else sonNode = delNode.Right;
}
/*이제 새로운 자식을 삭제 노드의 부모노드에 연결*/
if (key < parentNode.Key || parentNode == head)
parentNode.Left = sonNode;
else
parentNode.Right = sonNode;
}
* C로 배우는 알고리즘 참고 했음
* 첨부소스에 관해서
visual studio .net 2003으로 제작
첨부소스의 저작권은 sun77.egloos.com에 있으며
Copyright 만 붙혀주시면 어디서든 자유롭게 이용할수있습니다. ^^