게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
c++ 프로그래밍 질문좀 해도될까요...
게시물ID : computer_87124짧은주소 복사하기
작성자 : 내여친예쁘다
추천 : 0
조회수 : 514회
댓글수 : 5개
등록시간 : 2013/05/07 14:27:39

안녕하세요 오유님들

 

프로그래밍을 공부하고 있는 컴공 학부생입니다...

 

이번 과제가 레드블랙 트리를 구축하는 것인데요.

 

일단 이진탐색트리를 먼저 만들고 그 다음에 레드블랙 트리로 발전시켜나가려고하는데

 

이진탐색트리 구현과정에 막히는 부분이 있네요...

 

자식노드와 부모노드가 상호참조하게 하고 싶은데

 

현재 작성한 코드는 부모노드에서 자식노드로 가는 포인터만 존재하고 있습니다...

 

일단 코드 일부분만 올려볼게요.

 

#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;
  }
 }
}

이게 코드 일부분이고 주요한 부분은 빨간색으로 색칠해놨어요.

 

제멋대로 코드라서 해석하기 힘드실 것같네요...

 

그래도 과제여서 혼자 힘으로 해보려고했는데 도저히 저부분에서 막혀서 진도가 나가지 않아서

 

조언좀 얻고자 이렇게 도움을 청해봅니다...

 

프로그래밍 고수님들의 조언 부탁드립니다ㅠㅠ

전체 추천리스트 보기
[본인삭제]라오슈
2013-05-07 14:42:37추천 0
댓글 0개 ▲
[본인삭제]라오슈
2013-05-07 14:43:27추천 0
댓글 0개 ▲
2013-05-07 14:45:02추천 0
leaf node까지 내려온 다음에 한칸 더 내려가서  null인 경우 생성하시잖아요..?
다 내려와버려서 부모값이 뭔지 모르는 상태이기 때문에 생각하시기 어려운것 같아요..
왼쪽 오른쪽 보낼때 현재 노드의 포인터를 함께 보내주시거나..
아니면 왼쪽 오른쪽을 검사해서 현재 노드에서 자식을 추가 하는 개념으로 해보시면 어떨까요? ^^
댓글 0개 ▲
2013-05-07 15:40:05추천 0
댓글 감사합니다. 자식노드로 넘어갈때 현재노드의 주소를 임시로 저장할때 어떻게 코딩을 해야하나요? int로 햇더니 신택스에러가 나고... 새로운 노드객체를 만들어랴하나요? 코딩을 어떻게 해야하는지...ㅠ
댓글 0개 ▲
2013-05-07 17:14:37추천 0
void Tree::insertNodeHelper( TreeNode* curPtr, TreeNode **ptr, const int &value )


insertNodeHelper( *ptr, &((*ptr)->leftPtr), value );
댓글 0개 ▲
2013-05-07 17:16:52추천 0
curPtr을 lastPtr이나 parentPtr 정도로 네이밍 해서 쓰세요 :)
편한대로 썼더니 혼돈이 올 수 있는 네이밍이네요;
댓글 0개 ▲
2013-05-07 19:59:38추천 0
도움주신분들 정말감사합니다!!
댓글 0개 ▲
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호