<P>안녕하세요 오유님들</P> <P> </P> <P>프로그래밍을 공부하고 있는 컴공 학부생입니다...</P> <P> </P> <P>이번 과제가 레드블랙 트리를 구축하는 것인데요.</P> <P> </P> <P>일단 이진탐색트리를 먼저 만들고 그 다음에 레드블랙 트리로 발전시켜나가려고하는데</P> <P> </P> <P>이진탐색트리 구현과정에 막히는 부분이 있네요...</P> <P> </P> <P>자식노드와 부모노드가 상호참조하게 하고 싶은데</P> <P> </P> <P>현재 작성한 코드는 부모노드에서 자식노드로 가는 포인터만 존재하고 있습니다...</P> <P> </P> <P>일단 코드 일부분만 올려볼게요.</P> <P> </P> <P>#include <iostream><BR>#include <string></P> <P>using namespace std;</P> <P>class TreeNode{ <SPAN style="COLOR: #22741c">// 노드 클래스</SPAN><BR> friend class Tree;<BR>public:<BR> TreeNode( const int &d ) <SPAN style="COLOR: #22741c">// 노드 생성자. 서브트리를 생성한다.</SPAN><BR> : leftPtr( 0 ), data( d ), rightPtr( 0 ) <SPAN style="COLOR: #22741c">// 자기자신은 입력받은 데이터로 초기화, 왼쪽 자식과 오른쪽 자식 생성</SPAN><BR> {<BR> <BR> }<BR>private:<BR> TreeNode *leftPtr; <SPAN style="COLOR: #22741c">// 왼쪽 자식 포인터</SPAN><BR> TreeNode *rightPtr;<SPAN style="COLOR: #22741c"> // 오른쪽 자식 포인터</SPAN><BR> <SPAN style="COLOR: #ff0000">TreeNode *parPtr; // 부모 포인터</SPAN><BR> int data; <SPAN style="COLOR: #22741c">// 노드에 들어갈 데이터</SPAN><BR><SPAN style="COLOR: #22741c"> //int maxheight;</SPAN></P> <P> enum { red, black } color;<BR>};</P> <P>class Tree{ <SPAN style="COLOR: #22741c">// 트리 클래스</SPAN><BR>public:<BR> Tree();<SPAN style="COLOR: #22741c"> // 트리 생성자</SPAN><BR> void insertNode( const int & ); <SPAN style="COLOR: #22741c">// 입력 함수. insertNodeHelper를 호출한다.</SPAN><BR> void inOrderTraversal() const; <SPAN style="COLOR: #22741c">// 중위순회 함수. inOrderHelper를 호출한다.</SPAN><BR> void SearchNode( const int & );<SPAN style="COLOR: #22741c"> // 탐색 함수. SearchNodeHelper를 호출한다.</SPAN><BR><SPAN style="COLOR: #22741c"> //void TestHeight();</SPAN><BR>private:<BR> TreeNode *rootPtr; <SPAN style="COLOR: #22741c">// 루트 노드 포인터</SPAN></P> <P> void insertNodeHelper( TreeNode **, const int & ); <SPAN style="COLOR: #22741c">// 입력 함수</SPAN><BR> void inOrderHelper( TreeNode * ) const;<SPAN style="COLOR: #22741c"> // 중위순회 함수</SPAN><BR> void SearchNodeHelper( TreeNode *, const int & ); <SPAN style="COLOR: #22741c">// 탐색 함수</SPAN></P> <P> void reColoring();<BR> void reStructuring();</P> <P> <SPAN style="COLOR: #22741c">//높이 함수</SPAN><BR><SPAN style="COLOR: #22741c"> //void HeightHelper( TreeNode *, int &, int &, int & );</SPAN></P> <P> void AVLstructuring();<BR> <BR>};</P> <P>Tree::Tree(){ <SPAN style="COLOR: #22741c">// 트리를 생성함과 동시에 루트노드의 포인터를 0(External) 으로 초기화 한다.</SPAN><BR> rootPtr = 0;<BR>}</P> <P>void Tree::insertNode( const int &value ){<SPAN style="COLOR: #22741c"> // 입력 함수. main에서 데이터를 받아온다.</SPAN><BR> insertNodeHelper( &rootPtr, value );<BR>}</P> <P>void Tree::insertNodeHelper( TreeNode **ptr, const int &value ){<BR> if ( *ptr == 0 ){ <SPAN style="COLOR: #22741c">// 현재 가리키고 있는 노드가 External 노드이면 새로운 노드를 하나 생성한다.</SPAN><BR> *ptr = new TreeNode( value ); <SPAN style="COLOR: #22741c">// 노드 생성시 main에서 입력 받은 데이터로 초기화한다.</SPAN><BR><SPAN style="COLOR: #ff0000"> // 부모노드의 주소를 현재 노드의 parPtr에 저장해야함.</SPAN><BR> cout << value << " 가 입력되었습니다." << endl;<BR> }<BR> else{ <SPAN style="COLOR: #22741c">// 현재 가리키고 있는 노드가 internal 노드일 때 External 노드를 찾아간다.</SPAN><BR> if ( value < (*ptr)->data ){ <SPAN style="COLOR: #22741c">// 입력받은 값이 현재 노드의 데이터 값보다 작으면 왼쪽 노드를 확인한다.</SPAN><BR> insertNodeHelper( &((*ptr)->leftPtr), value );<BR> }<BR> else{<SPAN style="COLOR: #22741c"> // 입력받은 값이 현재 노드의 데이터 값보다 크면 오른쪽 노드를 확인한다.</SPAN><BR> if ( value > (*ptr)->data ){<BR> insertNodeHelper( &((*ptr)->rightPtr), value );<BR> }<BR> else<SPAN style="COLOR: #22741c"> // 입력 받은 값이 이미 트리에 있으면 메세지 출력</SPAN><BR> cout << value << "는 이미 존재하는 값입니다." << endl;<BR> }<BR> }<BR>}<BR></P> <P>이게 코드 일부분이고 주요한 부분은 빨간색으로 색칠해놨어요.</P> <P> </P> <P>제멋대로 코드라서 해석하기 힘드실 것같네요...</P> <P> </P> <P>그래도 과제여서 혼자 힘으로 해보려고했는데 도저히 저부분에서 막혀서 진도가 나가지 않아서</P> <P> </P> <P>조언좀 얻고자 이렇게 도움을 청해봅니다...</P> <P> </P> <P>프로그래밍 고수님들의 조언 부탁드립니다ㅠㅠ</P>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.