Algorithm - left child right sibling(LCMS) tree
tree란?
tree란 아래와 같은 구조로 여러 node가 한 node를 가르킬 수 없는 구조입니다.
다중트리
2진 트리
LCMS 구조
LCMS는 다중 트리의 구현 중 하나의 알고리즘 입니다.
다중트리 구현은 코드상 구현이 복잡하기 때문에 LCMS와 같이 2진 트리 형태로 구현을 하면 코드 복잡도를 줄일 수 있습니다.
LCMS는 말 그대로 왼쪽 노드에 자식을 추가하고 오른쪽 노드에는 같은 레벨의 형제를 추가합니다.
다중트리는 아래와 같이 자식이 여러개가 될 수 있습니다.
code 구현 C++
Add
노드를 2개 생성한 뒤 부모,자식을 연결해서 add합니다.
동일 부모로 노드를 생성한 뒤 add할 수 있습니다.
void LCRS_tree::addNode(lcrs* parent, lcrs* child) { if(mlcrs == NULL) { mlcrs = child; cout << "create root" << endl; return; } if(parent->leftchild == NULL) { parent->leftchild = child; //cout << "add left" << endl; } else { lcrs* mchild = parent->leftchild; while(mchild->rightsibling != NULL) { mchild = mchild->rightsibling; } mchild->rightsibling = child; //cout << "add right" << endl; } }
순회
자식->형제 노드 순으로 순회하면 모든 노드를 순회할 수 있습니다.
첫번째 순회
두번째 순회
세번째 순회
void LCRS_tree::printinfo(lcrs* node) { if(node->leftchild) { printinfo(node->leftchild); cout << endl; } if(node->rightsibling) { printinfo(node->rightsibling); } cout << node->index << ":item(" << *(string*)node->item << ") ,"; }
전체 소스는 아래 github을 참고해주시기 바랍니다.
https://github.com/juwith/jsutilspp/blob/master/tree-lcrs/src/hello.cpp
댓글
댓글 쓰기