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